如何用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.
相关产品推荐
相关产品推荐

