【问题标题】:Gnuplot - Variable xrange to plot only last week's worth of captured dataGnuplot - 变量 xrange 仅绘制上周捕获的数据
【发布时间】:2016-08-02 03:47:17
【问题描述】:

我正在从传感器捕获数据并将其输出到 .dat 文件中。我想使用 gnuplot 将此信息导出到绘图中,并让它完全自主地仅显示最近 7 天收集的数据(没有硬编码日期,应使用 time() 函数根据系统时间进行调整)

如果我对日期范围进行硬编码,即set xrange ["07-25-16":"08-25-16"],我不会收到任何错误,并且代码/绘图运行顺利。但是,如果我尝试使用 time() 函数绘制过去 7 天的时间函数,则会收到以下错误:

line 0: illegal month

这是我从传感器收集的数据 (output.dat):

07-21-2015 15:21 0 0 0
07-23-2016 15:21 0 0 0
07-29-2016 15:21 0 1 -1
07-29-2016 15:21 1 1 0
07-29-2016 15:21 2 1 1
07-29-2016 15:21 3 1 2
07-29-2016 15:21 3 2 1
07-29-2016 15:21 4 2 2
07-29-2016 15:21 5 2 3
07-29-2016 15:21 5 3 2
07-29-2016 15:21 5 4 1
07-29-2016 15:21 5 5 0
07-29-2016 15:22 6 5 1
07-29-2016 15:22 6 6 0
07-29-2016 15:23 1 0 1
07-29-2016 15:23 1 1 0

这是我正在运行的代码(注释掉有效的 xrange,替换为我正在尝试实现的代码):

set xdata time
set timefmt "%m-%d-%Y %H:%M"
xstart=strftime("%m-%d-%Y %H:%M", time(0) - 604800)
xend=strftime("%m-%d-%Y %H:%M", time(0))
#set xrange ["07-25-16":"08-25-16"]
set xrange ["xstart" : "xend"]
set format x "%m-%d\n%H:%M"
set title "Sensor Data"
set xlabel "Date\nTime"
set ylabel "Number of Sensor Trips"
plot    "output.dat" using 1:4 skip 1 t "Exits" with linespoints, \
        "output.dat" using 1:3 skip 1 t "Entrances" with linespoints
set term png
set output "output.png"
replot
set term x11

任何帮助将不胜感激。谢谢!

编辑 1 -- Gnuplot 现在在字符串修复后无法正确绘图(从 xrange 中删除 "" 以仅显示:set xrange [xstart:xend]

关于如何解决的任何想法?

【问题讨论】:

  • stftime 格式包括小时和分钟。你删除了吗?
  • 我没有删除它,因为我也想在图表上输出小时和分钟。这是错误的思考方式吗?
  • "xstart" 和 "xend" 不是日期字符串。删除那些引号?
  • 不同之处在于,您的硬编码字符串只是月份(工作),而您生成的不是。所以也许先解决这个问题。 xstart 和 xend 使用 as 变量也是如此
  • xstart 和 xend,没有日期字符串“”,摆脱了关于非法月份的错误,但图表现在不起作用。我将附在上面,以便您查看

标签: gnuplot


【解决方案1】:

如果绘制时间数据,您可以使用格式与数据文件中相同的时间字符串来指定轴范围,但您不能这样做。你可以简单地使用整数:

reset
set xdata time
set timefmt "%m-%d-%Y %H:%M"
set xrange [time(0) - 7*24*60*60:]
set format x "%m-%d\n%H:%M"
set style data linespoints

plot "output.dat" using 1:4 skip 1 t "Exits", \
     "" using 1:3 skip 1 t "Entrances"

【讨论】:

  • 谢谢克里斯托夫,成功了。你是救生员!
【解决方案2】:

为了完整起见,如果您想执行脚本中的操作,即两个给定日期之间的范围,请使用strptime

set xrange [strptime("%m-%d-%Y","07-25-16"):strptime("%m-%d-%Y","08-25-16")]

【讨论】:

    猜你喜欢
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 2013-08-01
    相关资源
    最近更新 更多