绘制日期和时间间隔以及夜间持续时间

问题描述 投票:0回答:1

我有一个日期+时间开始和停止的列表,我想将其绘制为条形。 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")
events gnuplot
1个回答
0
投票

我想到了以下解决方案。

一些评论:

  • 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 循环来完成此操作。 如果您启用自动范围和自动着色,则结果将如下所示:

enter image description here

  • 现在您将 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

结果:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.