在Gnuplot的两个日期之间绘制填充区域

时间:2012-06-11 00:21:57

标签: gnuplot

在x轴上,我有时间作为日期%Y-%m-%d。在y轴上我有整数。

基本上,我有每个数据点的日期范围,通常由目标日期和两侧的两周窗口给出。我使用垂直线为窗口的低端和高端绘制相对于该目标窗口的数据点。

我想遮蔽低端和高端之间的区域。

我尝试添加“with filledcurves x1 ='2000-01-01'”

由于

1 个答案:

答案 0 :(得分:1)

我认为你有几个选择。如果你想要绘制的阴影区域很少,你可以使用一个矩形(我想这会起作用 - 虽然我还没有测试过):

set xdata time
set timefmt '%Y-%m-%d'
set object rectangle from first '2000-01-01',graph 0 to first '2001-01-14',graph 1 fc rgb "red" solid back

另一种选择是您将数据文件格式化为:

#date         value     low-date     high-date
2000-01-12    12        2000-01-01   2000-01-26


2000-02-12    12        2000-02-01   2000-02-26


2000-03-12    12        2000-03-01   2000-03-26

请注意,每个“记录”之间有两个空格(三倍间距)。如果你的文件不是三倍间隔,你可以使用sed:

轻松地(在gnuplot中)
plot "< sed 'G;G' datafile.dat" ...

在特殊情况下,低日期和高日期正好是3600 * 24 * 14(两周内的秒数)低于/高于日期,您可以跳过最后两列并将其绘制成如下: / p>

NPOINTS=3  #Number of points in datafile.
YHIGH=15
set xdata time
set timefmt '%Y-%m-%d'
set style fill solid .5 noborder #somewhat transparent -- see "help fillstyle"
set yrange [0:YHIGH]
plot for [I=0:NPOINTS-1] 'test.dat' i I u 1:(YHIGH):(3600*24*14*2) w boxes,\
     for [I=0:NPOINTS-1] 'test.dat' i I u 1:2 w points ls I+1

第一遍绘制矩形,第二遍绘制点。这仅适用于该点位于范围的中心,并且每个范围正好是3600 * 24 * 14秒(2周)。请注意,您必须将点数和YHIGH设置为适用于您的数据的某个值。

如果范围可能偏斜 - 例如范围不是以问题为中心,你可以这样做:

NPOINTS=3
YHIGH=15

TIMEFMT='%Y-%m-%d'

set xdata time
set timefmt TIMEFMT
set style fill solid .5 noborder #somewhat transparent -- see "help fillstyle"
set yrange [0:YHIGH]

#difference between two times in seconds
boxwidth(s1,s2)=strptime(TIMEFMT,s1)-strptime(TIMEFMT,s2)  

#average of two times -- number of seconds since 2000 epoch.
boxmidpoint(s1,s2)=(strptime(TIMEFMT,s1)+strptime(TIMEFMT,s2))/2 

set macro  #just to make it a little easier to read.
BOXARGS='stringcolumn(4),stringcolumn(3)'
plot for [I=0:NPOINTS-1] 'test.dat' i I u (boxmidpoint(@BOXARGS)):(YHIGH):(boxwidth(@BOXARGS)) w boxes,\
     for [I=0:NPOINTS-1] 'test.dat' i I u 1:2 ls I+1