Gnuplot-如何不为不连续的日期/时间绘制一段线

Gnuplot-如何不为不连续的日期/时间绘制一段线,gnuplot,datetime-format,Gnuplot,Datetime Format,我试图从数据文件中绘制最后24小时。此数据文件已被删除 日期/时间和价值 以下是数据文件.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

我试图从数据文件中绘制最后24小时。此数据文件已被删除 日期/时间和价值

以下是
数据文件.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
,这是默认选项,如果其中一个点在范围内,则在两点之间绘制线。线在绘图边界处被剪裁<代码>设置剪辑两个将打印线部分,即使两个点都超出范围,但线穿过打印区域

使用
unset clip
仅在两个都在范围内的点之间绘制线

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首先在所有点(范围内和范围外)之间进行平滑,然后只应用剪裁规则。为了使平滑处理正确,您必须在将点处理到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'')" ''$1>=d'' datafile.dat'
plot filter using 1:2 with lines smooth bezier title "" 
设置数据文件分隔符“,”
设置扩展数据时间
设置时间“%Y-%m-%d-%H:%m:%S”
设置格式x“%d/%m\n%H:%Mh”
设置xrange[时间(0)-86400:时间(0)]
过滤器=“=d”“数据文件.dat”
使用1:2线条平滑的bezier标题“”打印过滤器

请注意,awk中的比较
$1>=d
是一种字符串比较,但对于您使用的时间格式来说,这很好。

Gnuplot有一个选项
set clip
,用于控制如何绘制连接到给定范围外点的线:
set clip one
,这是默认值,如果其中一个点在范围内,则在两个点之间绘制线。线在绘图边界处被剪裁<代码>设置剪辑两个将打印线部分,即使两个点都超出范围,但线穿过打印区域

使用
unset clip
仅在两个都在范围内的点之间绘制线

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首先在所有点(范围内和范围外)之间进行平滑,然后只应用剪裁规则。为了使平滑处理正确,您必须在将点处理到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'')" ''$1>=d'' datafile.dat'
plot filter using 1:2 with lines smooth bezier title "" 
设置数据文件分隔符“,”
设置扩展数据时间
设置时间“%Y-%m-%d-%H:%m:%S”
设置格式x“%d/%m\n%H:%Mh”
设置xrange[时间(0)-86400:时间(0)]
过滤器=“=d”“数据文件.dat”
使用1:2线条平滑的bezier标题“”打印过滤器

请注意,awk中的比较
$1>=d
是一个字符串比较,但对于您使用的时间格式来说,这很好。

gnuplot如何知道缺少数据点?通常,要中断一行,需要插入一个具有无效值的点,如
NaN
。但是你可能会遇到平滑的问题,因为
smooth-bezier
通过所有n个点绘制一个n-1阶的bezier。嗨,克里斯托夫,这是我的问题。如果我在第30天上午8:00,并将xrange设置为持续24小时,则gnuplot将从第29天上午8:00到第30天上午8:00划一条线。如果我没有第29天的数据,我无法理解为什么会包括第29天。如果我的数据文件有30、17、16、15天的数据。。。对我来说,gnuplot从30日上午0:00到30日上午8:00划一条线是有意义的。我知道这不到24小时,但事实上我在过去的24小时内没有连续的数据,所以为什么gnuplot不画出我所拥有的数据呢?gnuplot怎么知道缺少一个数据点?通常,要中断一行,需要插入一个具有无效值的点,如
NaN
。但是你可能会遇到平滑的问题,因为
smooth-bezier
通过所有n个点绘制一个n-1阶的bezier。嗨,克里斯托夫,这是我的问题。如果我在第30天上午8:00,并将xrange设置为持续24小时,则gnuplot将从第29天上午8:00到第30天上午8:00划一条线。如果我没有第29天的数据,我无法理解为什么会包括第29天。如果我的数据文件有30、17、16、15天的数据。。。对我来说,gnuplot从30日上午0:00到30日上午8:00划一条线是有意义的。我知道这不到24小时,但事实上我在过去24小时内没有连续的数据,所以为什么gnuplot不画出我所拥有的呢?