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

Cor*_*ith 5 gnuplot

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

所以 10 小时它应该看起来像:0:01:00, 0:02:00, .., 0:10:00insead of 9:23:00 ...(因为数据中的第一天是 9 号晚上 11 点)。

我当前的日期时间设置:

set xdata time
set timefmt "%Y-%m-%d %H:%M:%S"
set xtics format "%d:%H:%M" font ",25"
Run Code Online (Sandbox Code Playgroud)

编辑:如果有一种方法可以在没有日期信息的情况下从 x 轴上的 0 开始计算小时数,那也太棒了。无论哪种方式。我只想从 0 开始计数,以使“所用时间”非常清楚。

Chr*_*oph 2

我无法让它与 一起工作set xdata time,因为对于输出来说,只有月份中的某一天可用,该日期在范围内[1:31],因此0-position 将以 开头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
Run Code Online (Sandbox Code Playgroud)

以及示例脚本:

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 ''
Run Code Online (Sandbox Code Playgroud)

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

结果是:

在此输入图像描述

这是另一个变体,它使用更舒适的数据格式,使用逗号作为分隔符,并使用 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
Run Code Online (Sandbox Code Playgroud)

脚本文件:

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 ''
Run Code Online (Sandbox Code Playgroud)

结果是等效的。

编辑:最后一个变体,它是@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
Run Code Online (Sandbox Code Playgroud)

  • @CornSmith 请参阅编辑后的答案中的最后一个脚本。`$0` 是当前行的索引,`$0 == 0` 是第一行中的 `true`。 (2认同)