我有一个日期+时间开始和停止的列表,我想将其绘制为条形。 X 轴应为 18:00-06:00(午夜为中心),Y 轴为日期。 使用以下代码,跨午夜的间隔处理不正确。
### plot start stop times
reset session
$Data <<EOD
06.03.2019 09:45 11:17
07.03.2019 22:40 03:20
EOD
StartDay = "06.03.2019"
DaysAfterStartDay(day) = int((strptime("%d.%m.%Y",day)-strptime("%d.%m.%Y",StartDay))/86400)
set xdata time
set timefmt "%H:%M"
set format x "%H:%M"
plot $Data u (timecolumn(2)):(y=DaysAfterStartDay(strcol(1))): \
(timecolumn(2)):(timecolumn(3)):(y-0.2):(y+0.2):ytic(1) w boxxyerror \
fs solid 1.0 lc rgb "blue" notitle
### end of code
尝试过,但不起作用...请帮忙。
set xrange ["05:00":"19:00"]
set xtics add ("13:00" "01:00")
set xtics add ("14:00" "02:00")
set xtics add ("15:00" "03:00")
set xtics add ("16:00" "04:00")
set xtics add ("18:00" "06:00")
set xtics add ("19:00" "07:00")
set xtics add ("20:00" "08:00")
set xtics add ("21:00" "09:00")
set xtics add ("22:00" "10:00")
set xtics add ("23:00" "11:00")
set xtics add ("00:00" "12:00")
set xtics add ("01:00" "13:00")
set xtics add ("02:00" "14:00")
set xtics add ("03:00" "15:00")
set xtics add ("04:00" "16:00")
set xtics add ("05:00" "17:00")
set xtics add ("06:00" "18:00")
set xtics add ("08:00" "20:00")
set xtics add ("09:00" "21:00")
set xtics add ("10:00" "22:00")
set xtics add ("11:00" "23:00")
set xtics add ("12:00" "24:00")
我想到了以下解决方案。
一些评论:
gnuplot 使用从 1970 年 1 月 1 日起经过的秒数进行日期/时间计算。因此,一天有
Day = 24*60*60 = 86400
秒
在您的数据中,每行都有一个日期和两次时间。因此,假设间隔始终为 <24 hours in duration. So, if the time in column 3 is smaller than the time in column 2, then the time in column 3 is on the next day, hence add one day
简单地绘制时间间隔 3 次,分别在 x 方向上移动 -24、0 和 +24 小时,并相应地在 y 方向上移动 -1、0、+1 天。您可以使用 for 循环来完成此操作。 如果您启用自动范围和自动着色,则结果将如下所示:
现在您将 x 范围限制为所需的时间窗口范围(此处:
tStart
18:00,tEnd
06:00 + Day
)
另外(但不是绝对必要的)您还可以通过设置完全抑制该窗口之外的框,例如
boxxyerror
6 列样式(选中 help boxxyerror
)到 NaN
的 x 坐标,即 t0>tEnd || t1<tStart ? NaN : t1
此外,您可以通过
set link
链接y1和y2轴(检查help link
)。因此,在 y1 和 y2 轴上获得不同的日期标签
脚本:
### plot start/stop times over midnight
reset session
$Data <<EOD
06.03.2019 17:00 21:00
07.03.2019 19:00 22:00
07.03.2019 23:00 02:00
08.03.2019 22:00 01:00
09.03.2019 09:00 12:00 # this will not appear in the graph
10.03.2019 02:00 03:00
10.03.2019 04:00 20:00 # this will show up on two lines
11.03.2019 23:00 19:00 # ditto
12.03.2019 21:00 05:00
EOD
fmtH = "%H:%M"
fmtD = "%d.%m.%Y"
Day = 86400 # 1 day = 86400 secs
tStart = strptime(fmtH,"18:00")
tEnd = strptime(fmtH,"06:00") + Day
BoxH = 0.7 # box height
set xrange[tStart:tEnd]
set format x fmtH timedate
set yrange[:] noextend
set offset 0,0,Day/2,Day/2
set format y fmtD timedate
set grid x,y
set tics out
set arrow from first Day, graph 0 to first Day, graph 1 nohead dt 2
set style fill transparent solid 0.3
set key noautotitle
set link y2 via y+Day inverse y-Day
set format y2 fmtD timedate
set y2tics nomirror
plot for [i=-1:1] $Data u ( \
t0=timecolumn(2,fmtH)+i*Day, t1=timecolumn(3,fmtH)+ i*Day, \
t1=t1+(t1<t0 ? Day :0), t0>tEnd || t1<tStart ? t1 : t1): \
(y0=timecolumn(1,fmtD)-i*Day):(t0):(t1): \
(y0-Day*BoxH*0.5):(y0+Day*BoxH*0.5) w boxxy lc "blue"
### end of script
结果: