我正在绘制一些[日期,值]格式的数据(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开始计算,使“时间”非常明确。
答案 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 ''
使用外部工具提取第一列。
结果是:
这是另一种变体,它使用更舒适的数据格式,使用逗号作为分隔符,第一列用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
和输出:
此策略的问题是,一旦数据超过31天,日期计数器就会重置。
我无法弄清楚如何让xtics格式来操作数据列。
答案 2 :(得分:-1)
这是解决您问题的简单方法吗?
set xrange [0:]