使gnuplot的x轴从0开始,而不是从第一个日期开始

时间:2013-09-16 17:00:14

标签: gnuplot

我正在绘制一些[日期,值]格式的数据(cpu使用时间),并希望xtics从0或1而不是第一个日期开始。

因此,对于10个小时,它应该看起来像0:01:00, 0:02:00, .., 0:10:00 9:23:00 ...的{​​{1}}(因为数据的第一天是晚上11点的第9天)。

我当前的日期时间设置:

set xdata time
set timefmt "%Y-%m-%d %H:%M:%S"
set xtics format "%d:%H:%M" font ",25"

编辑:如果有一种方法可以计算x轴上从0开始的小时数,而没有日期信息也很棒。无论哪种方式。我只想从0开始计算,使“时间”非常明确。

3 个答案:

答案 0 :(得分:2)

我无法使用set xdata time,因为输出只有月中的某一天可用,在[1:31]范围内,所以0 - 位置将以1开头。对于总小时数也会发生同样的情况,因为该值仅限于[0:23],因此23以上的数字会被包裹回来。

这是一个没有时间数据的解决方案。我使用strptime函数将日期字符串转换为时间戳(以秒为单位),然后除以3600得到小时(作为浮点数):

测试数据文件是:

2013-08-25 18:45:11 100
2013-08-25 19:11:23 200
2013-08-25 20:00:32 400
2013-08-25 21:00:32 300
2013-08-26 20:11:12 500

示例脚本:

reset
file='data.txt'
fmt="%Y-%m-%d %H:%M:%S"
start=system('head -1 '.file)
start_stamp = strptime(fmt, start)
plot 'data.txt' using ((strptime(fmt, stringcolumn(1).' '.stringcolumn(2))-start_stamp)/3600.0):3 with lines t ''

使用外部工具提取第一列。

结果是:

enter image description here

这是另一种变体,它使用更舒适的数据格式,使用逗号作为分隔符,第一列用gnuplot提取:

数据文件:

2013-08-25 18:45:11,100
2013-08-25 19:11:23,200
2013-08-25 20:00:32,400
2013-08-25 21:00:32,300
2013-08-26 20:11:12,500

脚本文件:

reset
file='data.txt'
fmt="%Y-%m-%d %H:%M:%S"
set datafile separator ','
plot 'data.txt' using ($0 == 0 ? start_stamp = strptime(fmt, stringcolumn(1)) : 0, \
     (strptime(fmt, stringcolumn(1))-start_stamp)/3600.0):2 with lines t ''

结果是等效的。

编辑:最后一个变种,是@ andyras的混合物和我的答案。您可以set timefmt使用显式调用timecolumn来解析输入作为时间。然后输出像传统的双号一样处理。我使用$0,即当前样本的数量来设置偏移值:

reset
set timefmt "%Y-%m-%d %H:%M:%S"

offset = 0
t0(x)=(offset=($0==0) ? x : offset, x - offset)

plot 'data.txt' u (t0(timecolumn(1))/3600.0):3 notitle w l

答案 1 :(得分:1)

这不是一个很好的答案,但足够接近我发布的内容。

我有办法让你可以在零时刻启动时间档案(灵感来自this answer对我的一个老问题):

set xdata time
set timefmt "%Y-%m-%d %H:%M:%S"
set xtics format "%d:%H:%M" font ",6"

first = 0
offset = 0
# returns data offset by first value
t0(x)=(offset=(first==0)?x:offset,first=1,x-offset)

plot 'data.dat' u (t0(timecolumn(1))):3 notitle

以下是一些示例数据

2013-09-16 00:14:00 1
2013-09-26 00:15:00 3
2013-10-04 00:16:00 2
2013-10-19 00:17:00 4

和输出:

enter image description here

此策略的问题是,一旦数据超过31天,日期计数器就会重置。

我无法弄清楚如何让xtics格式来操作数据列。

答案 2 :(得分:-1)

这是解决您问题的简单方法吗?

set xrange [0:]