You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用gnuplot叠加绘制不同日期同一时段的时序数据?

解决Gnuplot中两天同时段数据叠加绘图的问题

你的问题根源在于:原始代码中x轴使用了完整的日期+时间字符串作为时间戳,两天的数据会因为日期不同,在x轴上按先后顺序排列,而非叠加在同一时段。要实现叠加,我们需要让两天的同一时段对应x轴上的同一个位置,这里提供两种简洁的解决方案:

方案1:统一基准日期

通过提取每行的时间部分(小时:分钟),拼接一个固定的基准日期,让所有数据的日期统一,这样同一时段的时间戳就会完全一致。修改后的代码如下:

set datafile separator ","
set terminal pngcairo size 500,200 enhanced font 'Verdana,10' linewidth 1
set output 'test.png'
set xdata time
set timefmt "%Y.%m.%d.%H:%M"
set format x "%H:%M"

# 核心处理:提取时间部分,拼接固定基准日期,统一时间戳
plot 'date1data.csv' using (strptime("%Y.%m.%d.%H:%M", "2000.01.01.".strftime("%H:%M", strptime("%Y.%m.%d.%H:%M", strcol(1))))):2 w lines lw 2 t "day1", \
     'date2data.csv' using (strptime("%Y.%m.%d.%H:%M", "2000.01.01.".strftime("%H:%M", strptime("%Y.%m.%d.%H:%M", strcol(1))))):2 w lines lw 2 t "day2"

代码解释:

  • strcol(1):读取第一列的原始日期时间字符串
  • strptime(...):将字符串转换为时间戳
  • strftime("%H:%M", ...):从时间戳中提取出小时和分钟部分
  • 拼接固定日期"2000.01.01."后,再次用strptime转换为统一的时间戳,确保同一时段的x值完全相同

方案2:计算当日时间偏移量

另一种思路是计算每个时间点距离当日0点的秒数,这样两天的同一时段(比如18:23)对应的秒数是完全一致的,x轴直接用秒数表示,再格式化为时间格式:

set datafile separator ","
set terminal pngcairo size 500,200 enhanced font 'Verdana,10' linewidth 1
set output 'test.png'

# 设置x轴范围为一天的总秒数(0到86400),并格式化为小时:分钟
set xrange [0:86400]
set format x "%H:%M" timedate

# 核心处理:计算当前时间戳与当日0点的差值(秒数)
plot 'date1data.csv' using (strptime("%Y.%m.%d.%H:%M", strcol(1)) - strptime("%Y.%m.%d.00:00", strcol(1))):2 w lines lw 2 t "day1", \
     'date2data.csv' using (strptime("%Y.%m.%d.%H:%M", strcol(1)) - strptime("%Y.%m.%d.00:00", strcol(1))):2 w lines lw 2 t "day2"

代码解释:

  • strptime("%Y.%m.%d.00:00", strcol(1)):生成当日0点的时间戳
  • 用原始时间戳减去当日0点的时间戳,得到该时间点在当天的秒数偏移量
  • x轴通过timedate格式,自动将秒数转换为%H:%M的时间显示

两种方法都能实现你想要的叠加效果,你可以根据自己的习惯选择其中一种。

内容的提问来源于stack exchange,提问作者Paul G.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:09:24