如何在feedgnuplot中使用gnuplot xdata时间?

时间:2015-09-28 08:14:49

标签: perl gnuplot

我使用feedgnuplot和gnuplot在我的linux桌面上显示实时数据。 我的数据是通过命令生成的,该命令在每行输出12个空格分隔的整数值,每秒最多输出4行。 我喜欢添加时间,所以我在将数据提供给feedgnuplot之前将时间放在行前面。 如果我将时间指定为秒,则正确绘制数据,但x轴非常难以理解:

data-producer | 
while read -a line
do
    echo -n $(date +"%s")
    for n in "${line[@]}"
    do
        echo -en "\t$n"
    done
    echo
done |
feedgnuplot --terminal 'qt' \
            --domain \
            --stream 1 \
            --xlen 5 \
            --with lines \
            --set "xdata time" \
            --set "timefmt '%s'"

所以我试图在水平尺度上获得人类可读的时间:

data-producer | 
while read -a line
do
    echo -n $(date +"%H:%M:%S")
    for n in "${line[@]}"
    do
        echo -en "\t$n"
    done
    echo
done |
feedgnuplot --terminal 'qt' \
            --domain \
            --stream 1 \
            --xlen 5 \
            --with lines \
            --set "xdata time" \
            --set "timefmt '%H:%M:%S'"

此行不起作用,因为feedgnuplot会抱怨未应用于数字数据的比较运算符:

Argument "09:45:58" isn't numeric in numeric lt (<) at /usr/bin/feedgnuplot line 694.
Argument "09:45:57" isn't numeric in numeric ge (>=) at /usr/bin/feedgnuplot line 797.

查看feedgnuplot代码(它是一个perl脚本)我看到对x值执行比较以对它们进行排序并评估是否必须再次绘制图形。

使用某些命令行开关是否可以拥有feedgnuplot处理时间?如果没有,在使用patchgnuplot源代码修补之前还有其他选择吗?谢谢。

1 个答案:

答案 0 :(得分:2)

Gnuplot需要对日期时间数据进行一些特殊设置(例如,必须指定using语句)。因此,feedgnuplot为时间数据--timefmt <format>提供了自己的选项:

for i in `seq 0 100`; do echo $i; sleep 1; done | 
while read -a line
do
    echo -n $(date +"%Y-%m-%d %H:%M:%S")
    for n in "${line[@]}"
    do
        echo -en "\t$n"
    done
    echo
done |
feedgnuplot --terminal 'qt' \
            --domain \
            --stream 1 \
            --lines \
            --timefmt "%Y-%m-%d %H:%M:%S" \
            --set 'format x "%H:%M:%S"'

请注意,不同版本的gnuplot使用不同的参考点以秒为单位的时间,因此版本4.6(参考2000年1月1日)和更早版本在使用%s时会给出错误的结果。因此,最好使用%H:%M:%S种类的时间格式。在上面的代码中,我使用了一个完全定义的日期时间来避免日常生成的图表可能出现的问题。