GnuPlot从x轴上的第0天开始绘制基于时间零点的数据

GnuPlot从x轴上的第0天开始绘制基于时间零点的数据,gnuplot,Gnuplot,我有一个数据文件,其中第一列是以秒为单位的时间。时间的起点是0,从那里开始 我想用格式为天:小时:分钟:秒的x轴绘制数据。T=0应映射到00:00:00:00。我不知道如何让天从00开始而不是01。我试过下面的方法。我还尝试将xrange设置为[-86400:173000],但它映射到365天,而不是0天。从t=0开始,绘制一些可能跨越几天的时间采样数据难道不是很常见吗 似乎GnuPlot需要一组不同的时间格式字符来进行基于零的时间绘制,而不是基于日期的绘制。除非它已经有了,而我却错过了 资料

我有一个数据文件,其中第一列是以秒为单位的时间。时间的起点是0,从那里开始

我想用格式为天:小时:分钟:秒的x轴绘制数据。T=0应映射到00:00:00:00。我不知道如何让天从00开始而不是01。我试过下面的方法。我还尝试将xrange设置为[-86400:173000],但它映射到365天,而不是0天。从t=0开始,绘制一些可能跨越几天的时间采样数据难道不是很常见吗

似乎GnuPlot需要一组不同的时间格式字符来进行基于零的时间绘制,而不是基于日期的绘制。除非它已经有了,而我却错过了

资料

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