不同线路上的时间戳和数据

问题描述 投票:0回答:1

我的数据文件采用以下格式:

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 轴值?

visualization gnuplot
1个回答
0
投票

虽然您的问题中缺少一些细节,但这里有一个建议作为起点。 你的数据格式有点“特殊”,但可以处理。对格式进行小的更改可能会简化脚本,但是,让我们从提供的数据格式开始。

滚动图的基本原理取自这里。只是您的数据有点不同。

仅发表一些评论,无需过多讨论细节:

  • 据我所知,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 倍)

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.