在横轴上设置一个时间区间
我尝试用gnuplot绘制一张图,目标是在一个时间段内绘制价格(凌晨4点到晚上10点,但跨越更长的时间段)。我的输入包含一个日期时间列和一个价格列:
$Data << EOD
2024-04-05T15:50:51+02 2.459
2025-06-06T21:30:51+02 2.339
2026-04-06T09:15:10+02 3.219
EOD
我尝试了这个:
GNUTERM = "wxt"
set terminal wxt enhanced
set encoding utf8
set xlabel "Time"
set ylabel "Price"
set xdata time
set timefmt "%Y-%m-%dT%H:%M:%S+02"
set format x "%H:%M"
#set xrange ["04:00":"22:00"]
set xrange [14400:79200]
# = Number of seconds elapsed from 0:00 (4:00 a.m. = 14400; 22:00 a.m. = 79200)
set yrange [0:]
set grid
plot $Data u (timecolumn(1,"%H:%M")):2 w lp pt 5 lc -1 notitle
这会产生一张图,但所有数据点都在晚上8点(20:00)。
我猜问题出在xrange的定义上,但使用我偏好的方法:
set xrange ["09:00":"22:00"]
不能在空的x 轴范围内绘制!
解决方案
我的理解是,你想把来自多天的数据简单地按日间时间而不是按日期来绘制。我的第一想法是使用函数 tm_hour(), tm_min(), tm_sec()。请查看 help tm_hour() 等。
gnuplot将时间数据视为自1970年 1月 1日起经过的秒数。通过定义函数 daytime(),你将把所有时间数据投影到1970年 1月 1日。然后将这一天在 04:00 到 22:00 的时间段进行绘制,也就是以秒为单位的 3600*4 到 3600*22。
请查看下面的最小示例,它会再创建一些随机数据点。若你想用你自己的数据,可以跳过这一部分。
脚本:
### plot time data only versus daytime
reset session
fmt = "%Y-%m-%dT%H:%M:%S+02"
# create some random test data
set table $Data
t(n) = time(0)+rand(0)*30*86400
y0(t) = cos((tm_hour(t)-12)/pi)+rand(0)+1.0
plot '+' u (strftime(fmt,t0=t(0))):(y0(t0)) w table
unset table
daytime(col) = (t0=timecolumn(col,fmt), tm_hour(t0)*3600 + tm_min(t0)*60 + tm_sec(t0))
set format x "%H:%M" timedate
set xrange [3600*4 : 3600*22]
set yrange [0:]
set grid
set key noautotitle
plot $Data u (daytime(1)):2 w p pt 5 lc "red"
### end of script
结果:
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

