如何为多行Y轴数据复用单个X轴时间戳制作Gnuplot滚动图?
动态Gnuplot滚动图:为多行Y值复用单个时间戳X轴值
数据文件格式
2024-11-11 11:08:39 [1]123,45,67,89,0,0,0 [2]11,22,33,44,0,0,0 [5]99,88,77,66,0,0,0 2024-11-11 11:08:40 [1]123,45,67,89,0,0,0 [2]55,66,77,88,0,0,0 [5]99,88,77,66,0,0,0
该数据文件每秒会追加一个上述格式的数据块。我需要制作动态滚动Gnuplot图,以每个数据块首行的时间戳作为X轴值,绘制[2]行的第3个参数(比如第一块中是33,第二块中是77)。请问如何让后续行的Y轴值复用对应数据块的单个X轴时间戳?
解决方法
核心思路是在Gnuplot里用变量缓存当前数据块的时间戳,遇到目标行([2]行)时,取出缓存的时间戳作为X值,提取对应Y值绘图。
1. 配置时间戳解析
先让Gnuplot能正确识别你的时间格式:
set xdata time set timefmt "%Y-%m-%d %H:%M:%S" set format x "%H:%M:%S" # 可根据需求调整X轴显示格式
2. 编写数据处理与绘图脚本
用变量缓存时间戳,结合条件判断提取目标数据:
# 初始化时间戳缓存变量 current_time = "" # 绘图逻辑:只处理目标行,复用对应时间戳 plot "data.txt" using ( \ # 识别时间戳行(无[]开头),缓存时间戳,返回NaN不绘图 strcol(1) !~ /^\[/ ? (current_time = strcol(1), NaN) : \ # 识别[2]行,用缓存的时间戳做X轴,提取第3个参数做Y轴 strcol(1) =~ /^\[2\]/ ? (timecolumn(current_time, "%Y-%m-%d %H:%M:%S"), \ real(word(substr(strcol(1), 4), 3, ",")) \ ) : NaN \ ) with linespoints title "[2]第3个参数"
3. 实现动态滚动效果
添加循环刷新和滚动窗口配置,实现每秒更新的滚动图:
set terminal x11 persist # 保持绘图窗口不关闭 set autoscale y # 自动适配Y轴范围 set xrange [time(0)-60:*] # 显示最近60秒的数据,形成滚动窗口 set grid # 显示网格线 # 循环刷新数据,每秒更新一次 while (1) { replot pause 1 }
关键逻辑说明
- 遇到无
[]开头的行时,把该行内容存到current_time变量里,返回NaN让该行不参与绘图 - 遇到
[2]开头的行时,用timecolumn把缓存的时间戳转成Gnuplot能处理的时间值作为X轴;同时用substr去掉[2]前缀,再用word按逗号分割提取第3个参数作为Y轴 - 其他行返回
NaN,不显示在图上
内容的提问来源于stack exchange,提问作者user28255442
相关产品推荐
相关产品推荐

