动态 Gnuplot 图表

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

我有一个不断更新的数据文件。我想使用 Gnuplot 动态绘制更新数据文件,可能使用最后 100 个数据点的窗口。

可能吗?如果是这样,我们将不胜感激。

file dynamic graph gnuplot
3个回答
4
投票

这是使用 Gnuplot 和一些 bash 脚本来完成此任务的一种方法:

# An updating data file
while :; do echo $((RANDOM%100)); sleep .1; done > datafile

使用plot命令初始化Gnuplot,并让其他更新来自replot:

(
  echo "plot [0:100] [0:100] '< tail -n100 datafile' with lines";
  while :; do sleep .4; echo replot; done
) | gnuplot -persist

这使得 Gnuplot 每 0.4 秒评估一次

tail -n100 datafile
并将结果用作数据集。 tail 命令返回
datafile
的最后 100 行。


3
投票

这是一个 gnuplot-only 版本,无需外部脚本。 它也适用于 gnuplot 4.6.0(OP 提出问题时的版本)。 由于我缺乏不断更新的数据源,因此我在 gnuplot 本身内创建数据文件。如果您的文件已通过其他程序从外部更新,请跳过标有

# *skip
的行。

绘图正在

while
循环中运行(选中
help while
),可以通过按
x
停止,选中
help bind
。通过设置适当的数字来调整绘图之间的时间延迟(检查
help pause
)。

脚本:(适用于 gnuplot>=4.6.0,2012 年 3 月)

### dynamic plotting of last N points
reset

FILE = 'SO13749553.dat'

set print FILE          # *skip lines if data file is updated by another program
set print FILE append   # *skip
n = 0                   # *skip

N = 20                  # plot last N values
bind x 'stop = 1'       # stop loop by pressing "x"
stop = 0
set yrange [0:3]

while (!stop) {

    print sprintf("%g %g",n=n+1,sin(n/3.)+rand(0)*0.5+1)   # *skip

    pause 0.05                            # pause in seconds
    stats [*:*][*:*] FILE u 0 nooutput    # analyze file and get number of lines
    N0 = STATS_records                    # number of lines
    N1 = N0<N ? 0 : N0-N                  # line index of N-last line

    plot FILE u 1:2 every ::N1 w lp pt 7 ti sprintf("Last %d of %d values",N0-N1,N0)
}
set print               # *skip
### end of script

结果:(在 gnuplot 4.6.0 上使用 ScreenToGif 从 wxt 终端进行屏幕截图)

enter image description here


1
投票

使用 进行动态绘图:

仅最后 100 个值

通过
gnuplot
脚本(快速演示)

只需尝试这两个命令:

.1 在后台填充动态数据文件

ping -i.2 google.com |
    sed -ue 's/.*seq=\([0-9]\+\) .*time=\([0-9.]\+\) .*/\1 \2/p;d' > file.dat &

.2 使用内联脚本运行 gnuplot (随意将

MAX=40
替换为
MAX=100
;-)

MAX=40
gnuplot -e "while(1){pause 0.1;stats 'file.dat' u 0 nooutput;
    lPnts=STATS_records<$MAX?0: STATS_records-$MAX;
    plot 'file.dat' using 1:2 skip lPnts title 'google' w st  }"

您必须按 Ctrl+C 退出 gnuplot,然后

kill %%
停止运行
ping

通过 脚本

有一个小 脚本维护数据文件,仅保留最后 100 个值。这只需使用一个计数器,然后一旦计数器达到限制就删除数据文件中的第一个值:

#!/bin/bash

declare TMPDIR=/tmp DEST=${1:-google.com} DELAY=${2:-.25} MAXDATA=100
[ -d /dev/shm ] && [ -w /dev/shm ] && TMPDIR=/dev/shm
read -r TMPDAT < <(mktemp -p "$TMPDIR" --suffix .dat plot-XXXXXXXXXX)

exec {PFD}> >(exec gnuplot)
closExit() { exec {PFD}>&- ; [ -f "$TMPDAT" ] && rm "$TMPDAT" ; exit ;}
trap closExit 0 1 2 3 6 15

getDatas() {
    read -r data < <(
        ping -c 1 -n "$DEST" 2>&1 |
            sed -u 's/^64.*time=\([0-9.]\+\) .*$/\1/p;d'
    )
    now=$EPOCHREALTIME
    printf '%.6f %s\n' >>"$TMPDAT" "$now" "$data"
    (( cnt++ > MAXDATA )) && sed -e 1d -i "$TMPDAT"
    printf ' %8d %(%a %b %d %T)T.%s %s\n' \
            "$cnt" "${now%.*}" "${now#*.}" "$data"
}
getDatas

echo >&$PFD "set term wxt noraise persist title 'Ping $DEST';"
echo >&$PFD "set xdata time;"
echo >&$PFD "set timefmt '%s';"

while ! read -rsn 1 -t "$DELAY" ;do
    getDatas
    echo >&$PFD "plot '$TMPDAT' using 1:2 with line title 'ping $DEST';"
done

示例运行(加速约 x15 动画 gif):

Ping graph sample

多进程演示脚本

我编写了一个 multiping bash 脚本,它可以动态运行 gnuplot (并 ping 到尽可能多的后台任务)。

在此脚本中,对第 N 个最后值没有限制,但此脚本展示了如何从许多不同的流中读取数据,保留 STDIO 以实现交互性,并寻址另一个流以将 plot Upgrade 排序为

gnuplot
sub -过程。

你可以运行:

multiping.sh -pci .3 www.google.com www.stackexchange.com

目标是创建 interactive 脚本来管理不同的子流程,用于输入和/或输出。

命令

跑步时,您可以与:

  • q退出(关闭所有FD,终止所有子进程)
  • p 使用新的
    gnuplot
    子流程
  • 开始绘图
  • s 停止绘图
  • r 重置控制台终端
  • h 在控制台终端中打印标题行

用法

命令行

-h
开关将显示然后帮助:

Usage: multiping.sh [-[cdhp]] [-i N] <host or ip> [host or ip] [host or ip]...
  Options:
    -c      colors (red for no answer, green for higher "seq" number)
    -d      Debug this (by opening 2 xterm windows... look at script)
    -h      help (print this)
    -iN     Interval for ping command (min 0.2 in user mode)
    -p      Plot dynamically (require gnuplot)
    All following argument will be "target" for "ping" command.
© www.soinside.com 2019 - 2024. All rights reserved.