我的数据文件采用以下格式:
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
数据文件每秒附加一次类似的数据块。我想制作一个滚动图,如参数的 Dynamic Gnuplot graphs 所示,例如第 [2] 行参数 3,使用块的第一行时间戳作为 x 轴值。
如何使用单个 x 轴值作为多个后续行 y 轴值?
虽然您的问题中缺少一些细节,但这里有一个建议作为起点。 你的数据格式有点“特殊”,但可以处理。对格式进行小的更改可能会简化脚本,但是,让我们从提供的数据格式开始。
滚动图的基本原理取自这里。只是您的数据有点不同。
仅发表一些评论,无需过多讨论细节:
据我所知,gnuplot 没有内在的方法来绘制最后 N 个数据点。因此,您必须使用外部工具或使用 gnuplot 功能
stats
对文件进行一些统计。通过这个,您可以找出行数、块数、子块数,以及最小值、最大值、平均值等(检查help stats
)。如果您的文件很大(兆字节或千兆字节),这可能需要一些时间。
伪列-1,即
column(-1)
,(检查help pseudocolumns
)保存子块的索引值b1
(从零开始)。因此,如果这个数字发生变化,即 b0!=b1
,您将获得包含日期/时间的子块的第一行。将此值存储在 t0
中。
您可以
set datafile separator "[],"
它将数据按给定字符分成列。因此,[]
中的选择器将位于第 2 列,而您的“参数 n
”将位于第 n+2 列。
如果您需要通过线路连接数据点,则需要一个解决方法(此处未实现),因为当数据中存在空行时,gnuplot 会中断线路(此处就是这种情况)。
由于我没有创建一些数据的外部源,因此一些测试数据是在脚本本身内创建的。如果您的文件已通过其他程序从外部更新,请跳过标有
# *skip
的行。
文件中的数据
SO79180869.dat
看起来像这样:
2024-11-12 16:26:14
[1]73,8,16
[2]6,20,29
[5]23,17,39
2024-11-12 16:26:15
[1]45,92,68
[2]72,7,47
[5]8,36,48
2024-11-12 16:26:16
[1]71,35,66
[2]37,9,34
[5]17,62,93
...
脚本:
### dynamic plotting of last N points of special data format
reset session
FILE = "SO79180869.dat"
set print FILE # *skip these lines if your file is updated by another program
set print FILE append # *skip
N = 10 # plot last N values
bind x 'stop = 1' # stop loop by pressing "x"
stop = 0
set yrange [0:100]
set datafile separator "[],"
myFilter(q,p) = column(2)==q ? column(p+2) : NaN
myFmt = "%Y-%m-%d %H:%M:%S"
myDate(col) = (b0=b1, b1=column(-1), b0==b1 ? t0 : t0=timecolumn(col,myFmt))
set format x "%H:%M:%S" timedate
set xrange [:] noextend
while (!stop) {
print strftime(myFmt, time(0)) # *skip
print sprintf("[1]%d,%d,%d",rand(0)*100,rand(0)*100,rand(0)*100) # *skip
print sprintf("[2]%d,%d,%d",rand(0)*100,rand(0)*100,rand(0)*100) # *skip
print sprintf("[5]%d,%d,%d",rand(0)*100,rand(0)*100,rand(0)*100) # *skip
print "" # *skip
pause 1.0 # pause in seconds
stats [*:*][*:*] FILE u (N0=column(-1)+1) nooutput # analyze file and get number of subblocks
N1 = N0<N ? 0 : N0-N # line index of N-last line
plot b1=t0=NaN FILE u (myDate(1)):(myFilter(5,3)) every :::N1 \
w lp pt 7 ti sprintf("Last %d of %d values",N0-N1,N0)
}
set print # *skip
### end of script
结果:(从 wxt 终端使用 ScreenToGif 进行屏幕截图,速度快 2 倍)