在横轴上设置一个时间区间

编程语言 2026-07-10

我尝试用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:0022:00 的时间段进行绘制,也就是以秒为单位的 3600*43600*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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章