GnuPlot从x轴上的第0天开始绘制基于时间零点的数据
我有一个数据文件,其中第一列是以秒为单位的时间。时间的起点是0,从那里开始 我想用格式为天:小时:分钟:秒的x轴绘制数据。T=0应映射到00:00:00:00。我不知道如何让天从00开始而不是01。我试过下面的方法。我还尝试将xrange设置为[-86400:173000],但它映射到365天,而不是0天。从t=0开始,绘制一些可能跨越几天的时间采样数据难道不是很常见吗 似乎GnuPlot需要一组不同的时间格式字符来进行基于零的时间绘制,而不是基于日期的绘制。除非它已经有了,而我却错过了 资料 GnuPlot脚本GnuPlot从x轴上的第0天开始绘制基于时间零点的数据,gnuplot,Gnuplot,我有一个数据文件,其中第一列是以秒为单位的时间。时间的起点是0,从那里开始 我想用格式为天:小时:分钟:秒的x轴绘制数据。T=0应映射到00:00:00:00。我不知道如何让天从00开始而不是01。我试过下面的方法。我还尝试将xrange设置为[-86400:173000],但它映射到365天,而不是0天。从t=0开始,绘制一些可能跨越几天的时间采样数据难道不是很常见吗 似乎GnuPlot需要一组不同的时间格式字符来进行基于零的时间绘制,而不是基于日期的绘制。除非它已经有了,而我却错过了 资料
我可以带你走一段路。Gnuplot有一组单独的相对时间的时间格式。从零开始,处理正间隔和负间隔。在文档中很难找到它,但这里有一节来自“帮助时间”说明符 时间格式示例: 日期格式说明符将以秒为单位的时间编码为时钟时间 在某一天。所以从0到23小时,从0到59分钟, 负值对应于纪元之前的日期 1970年1月1日。为了以秒为单位报告时间值 相对于时间0的时/分/秒数,使用时间 将%tH%tM%tS.格式化为报告-3672.50秒的值
set format x # default date format "12/31/69 \n 22:58"
set format x "%tH:%tM:%tS" # "-01:01:12"
set format x "%.2tH hours" # "-1.02 hours"
set format x "%tM:%.2tS" # "-61:12.50"
将这些相对时间格式与示例数据结合使用,我可以得到:
$data << EOD
0 0
3600 10
7200 30
21600 50
160000 100
EOD
set xtics time format "%tH:%tM:%tS"
set title 'set xtics time format "%tH:%tM:%tS"'
set xrange [0:173000]
plot $data using 1:2 with lp
正如上面的评论中提到的,一种解决方法是使用周天数,但这会将您限制为7天。 由于0秒对应于1970年1月1日星期四00:00:00,因此必须减去4天=24*3600*4秒,使其成为星期日=0 另一个奇怪的解决方法是使用multiplot和plot两次,仅用于日期标签。您必须设置一个底部边距,以完全覆盖上一个绘图。仍有微调的余地 顺便问一下:如果刻度是几天,那么问题是标签上的秒数是否真的相关 代码: 结果:
你需要画多少天?少于或多于7天?如果小于7,那么我将看到一个变通方法。哈:。我想你是这个意思。设置格式x%02w:%H:%M:%S设置范围xrange[-345600:173000]这是一段很长的路。我可能会考虑使用它。我希望用一种新的格式修改我现有的代码,而不需要添加任何逻辑。但至少有一个解决办法。谢谢@theozh.回答您的问题。我正在跟踪长时间模拟的结果。有些会持续一周以上,但大多数不会。所以这是一个体面的工作。令人惊讶的是,这是我正在采用的一种新颖的绘图方法。这似乎是很平常的事。就像v1.1的功能一样。不是v5.5。谢谢你真的走了这么远!有时我跟踪一个持续几分钟的模拟,有时长达两周。但我同意我应该在一个小时内检测到任何东西,并将秒数剃掉。好主意
Format Explanation
%tH +/- hours relative to time=0 (does not wrap at 24)
%tM +/- minutes relative to time=0
%tS +/- seconds associated with previous tH or tM field
set format x # default date format "12/31/69 \n 22:58"
set format x "%tH:%tM:%tS" # "-01:01:12"
set format x "%.2tH hours" # "-1.02 hours"
set format x "%tM:%.2tS" # "-61:12.50"
$data << EOD
0 0
3600 10
7200 30
21600 50
160000 100
EOD
set xtics time format "%tH:%tM:%tS"
set title 'set xtics time format "%tH:%tM:%tS"'
set xrange [0:173000]
plot $data using 1:2 with lp
secperday = 3600*24
days(t) = gprintf("%02g:", int(t)/secperday)
hours(t) = strftime("%02tH:%tM:%tS", int(t)%secperday)
# Create ten days worth of tic labels
# Every six hours with no label; once a day with full label
set xtics 6*3600 format ""
do for [i=0:10] {
T = day * secperday
set xtics add ( days(T).hours(T) T )
}
plot $data using 1:2 with lp
### timedate days starting from zero
reset session
$Data <<EOD
0 0
3600 10
7200 30
21600 50
160000 100
450000 222
500000 333
EOD
set multiplot layout 2,1
# first workaround, limited to 7 days
set format x "day %1w\n%H:%M:%S" timedate
plot $Data u ($1-24*3600*4):2 w lp pt 7 notitle
# second workaround, using multiplot
set format x "\n%H:%M:%S" timedate
set bmargin 3
plot $Data u 1:2 w lp pt 7 notitle
set multiplot previous
set format x "day %s"
set xrange[GPVAL_X_MIN/86400:GPVAL_X_MAX/86400]
plot $Data u ($1/86400):2 w p ps 0 notitle # point size zero, i.e. invisible
unset multiplot
### end of code