使用Gnuplot绘制时间轴对齐的温度曲线图遇问题求助
解决Gnuplot绘制24小时温度时序图的问题
一、修复HH:MM格式下的X轴异常与数据识别错误
你最初用HH:MM格式存储时间时,Gnuplot会把这些时间视为同一天的循环值(比如昨天19:00和今天19:00的HH:MM完全相同),导致X轴显示00:00到00:00的循环范围。手动设置时间范围时报错all points y value undefined!,是因为Gnuplot无法将纯HH:MM映射到你指定的跨天时间区间。
如果想保留HH:MM格式,可按以下方式处理:
- 将时间转换为相对于起始时刻的分钟数(首行=0分钟,末行=1439分钟),在Gnuplot中动态计算:
# 告诉Gnuplot第一列是HH:MM格式 set timefmt "%H:%M" # 将时间转换为分钟数并绘图 plot "fre.24.val" using (strptime("%H:%M", strcol(1))):2 with lines title "当前温度", \ "" using (strptime("%H:%M", strcol(1))):3 with lines title "24小时前温度" # 设置X轴刻度为对应的HH:MM set xtics 1440/24, 1440/48 rotate by 45 set format x "%H:%M" - 若要强制X轴显示跨天范围,可在Python生成数据时给昨天的时间加上日期后缀,本质和改用
%Y-%m-%d %H:%M的思路一致。
二、校准带日期时间格式的X轴范围
改用%Y-%m-%d %H:%M格式后,需确保Gnuplot正确解析时间并动态匹配当前24小时窗口:
完整Gnuplot脚本示例
# 配置时间解析格式 set timefmt "%Y-%m-%d %H:%M" set xdata time # 设置X轴范围为当前时间前24小时到当前时间 set xrange [strftime("%Y-%m-%d %H:%M", time(0)-86400):strftime("%Y-%m-%d %H:%M", time(0))] # 配置X轴刻度显示 set xtics 3600 rotate by 45 # 每小时一个刻度,旋转45度避免重叠 set format x "%H:%M" # 处理数据缺失,过滤无效值(假设缺失值为空,可根据实际调整) plot "fre.24.val" using 1:($2 eq "" ? NaN : $2) with lines title "当前温度", \ "" using 1:($3 eq "" ? NaN : $3) with lines title "24小时前温度"
关键检查点
- Python数据生成准确性:确保末行时间是
当前时间-1分钟,示例代码:import datetime end_time = datetime.datetime.now() - datetime.timedelta(minutes=1) start_time = end_time - datetime.timedelta(hours=24) # 循环生成每分钟的时间、当前温度、24小时前温度 - Gnuplot时间范围匹配:
time(0)是当前时间戳,86400是24小时的秒数,strftime转换后的格式必须和数据文件中的完全一致(包括分隔符、补零规则)。
三、解决数据缺失导致的曲线异常
你用unique避免异常曲线是可行的,但更精准的方式是过滤无效数据点:
- 如果温度缺失时存储的是空字符串或特定值(如
-999),在Gnuplot中用NaN标记这些点,Gnuplot会自动跳过,不会生成异常连线:# 假设缺失值为-999 plot "fre.24.val" using 1:($2 == -999 ? NaN : $2) with smooth csplines title "当前温度" - 如果是数据点不连续(少了几分钟的数据),用
with lines替代csplines可以避免曲线强制插值,保留真实断点;若需要平滑曲线,确保有效数据点连续后再用csplines。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

