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

在Gnuplot中绘制两个日期之间的填充区域,gnuplot,Gnuplot,在x轴上,我有时间作为日期%Y-%m-%d。在y轴上我有整数 基本上,每个数据点都有一个日期范围,通常由目标日期和两侧的两周窗口给出。I使用窗口低端和高端的垂直线绘制相对于目标窗口的数据点 我想遮住低端和高端之间的区域 我尝试添加“带填充曲线x1='2000-01-01'” 谢谢我想你在这里有一些选择。如果只需要绘制几个着色区域,则可以使用矩形(我想这会起作用——尽管我还没有测试过): 另一个选项是按如下方式格式化数据文件: #date value low-date

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

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

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

我尝试添加“带填充曲线x1='2000-01-01'”


谢谢

我想你在这里有一些选择。如果只需要绘制几个着色区域,则可以使用矩形(我想这会起作用——尽管我还没有测试过):

另一个选项是按如下方式格式化数据文件:

#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
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
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 
请注意,每个“记录”之间有两个空格(三倍行距)。如果您的文件不是三倍行距的,您可以使用sed轻松地(在gnuplot中)执行此操作:

plot "< sed 'G;G' datafile.dat" ...
第一个过程绘制矩形,第二个过程绘制点。仅当点位于范围的中心,且每个范围正好为3600*24*14秒(2周)时,此选项才有效。请注意,您必须将点数和YHIGH设置为适用于数据的某个值

如果范围可能发生倾斜,例如,范围不在所讨论的点上居中,您可能可以执行以下操作:

#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
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
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 

什么是“低端”和“高端”?低表示两周前,高表示两周后?您是否试图以不同的颜色绘制每1个月间隔的条形图?是的,有一个目标日期和低(前两周)和高(后两周)。现在我用脉冲来画线来标记高低,用点来表示目标日期,用X来表示实际事件发生的地点。这是一个例子。这将是很好的阴影之间的垂直线区域,我想知道是否gnuplot有这种能力的日期/时间数据。谢谢你的回答。这对解决我的问题很有帮助。我想我没有意识到的关键点是,时间轴是以秒为单位的,使用以目标日期为中心的框宽为4周(以秒为单位)的“框”进行设置非常有效@user1447791——是的,gnuplot从2000年开始以秒为单位跟踪时间。这是一件值得铭记的事情。