Gnuplot - 如何不为非连续 date/time 绘制一条线

Gnuplot - How do not plot a piece of line for non-contiguous date/time

我正在尝试从数据文件中绘制过去 24 小时的图。这个数据文件有 date/time 和价值

以下是datafile.dat的内容:

2015-12-17-21:07:41,74.30
2015-12-17-21:08:41,74.10
2015-12-17-21:08:41,74.10
2015-12-30-21:08:41,79.10
2015-12-30-21:09:41,79.10
....

gnuplot 脚本下方

set datafile separator ","
set terminal png font arial 12 size 1000,600
set xdata time
set timefmt "%Y-%m-%d-%H:%M:%S"
set format x "%d/%m\n%H:%Mh"
set xrange [ time(0) - 86400 : time(0) ]    # 86400 sec = 1 day 
set grid
set output "/data/weather/humidity.png"
plot "datafile.dat" using 1:2 with lines smooth bezier title "" 

由于我的文件中没有第 29 天的数据,为什么 gnuplot 从第 29 天到第 30 天画了一条线? 我在第 29 天的数据文件中没有行,我不想绘制它们。 如果我的文件里没有24小时的数据,我想画出我有的。

我该怎么做?

Gnuplot 有一个选项 set clip 控制如何绘制连接到给定范围外的点的线:set clip one,这是默认设置,如果其中一个点是,则在两点之间绘制线in-range。该线在绘图边界处被剪裁。 set clip two 将绘制线部分,即使两个点都是 out-range,但线穿过绘图区域。

使用 unset clip 仅绘制点之间的线,这些点都是 in-range.

set datafile separator ","
set xdata time
set timefmt "%Y-%m-%d-%H:%M:%S"
set format x "%d/%m\n%H:%Mh"
set xrange [ time(0) - 86400 : time(0) ]
unset clip
plot "datafile.dat" using 1:2 with lines title "" 

不幸的是,平滑不能正常工作,因为 gnuplot 首先在所有点(in-range 和 out-range)之间进行平滑,然后只应用裁剪规则。为了正确处理平滑句柄,您必须先过滤这些点,然后再将它们处理到 gnuplot,例如用 awk:

set datafile separator ","
set xdata time
set timefmt "%Y-%m-%d-%H:%M:%S"
set format x "%d/%m\n%H:%Mh"
set xrange [time(0) - 86400 : time(0)]

filter = '< awk -F, -v d="$(date -d''24 hours ago'' +''%F-%T'')" ''>=d'' datafile.dat'
plot filter using 1:2 with lines smooth bezier title "" 

请注意,awk 中的比较 >= d 是字符串比较,但这对于您使用的时间格式来说没问题。