Gnuplot的替代方案,具有更高的时间精度

7
目前我正在使用gnuplot根据时间线绘制数据。然而,时间线的精度是毫秒级别的,但gnuplot似乎只能处理秒级别的时间。
我看了一些替代方案,但实际上我只需要像gnuplot一样能够处理小数秒的工具。
主要脚本使用的编程语言是Python,虽然我看过matplotlib,但它似乎比gnuplot更加“重型”。由于我不总是更新图形方面的内容,所以我希望尽可能保持简单。
有什么建议吗?
更新:
我正在使用gnuplot进行此操作:
set xdata time
set timefmt "%Y-%m-%d-%H:%M:%S"

然而,没有%f可以获取毫秒。例如,这个是可行的:
2011-01-01-09:00:01

但我需要:
2011-01-01-09:00:01.123456

2
你能发布一下你要绘制的数据片段和你正在使用的命令吗?gnuplot不应该关心单位——毕竟它怎么知道它们是秒还是毫秒呢?所以我不太确定它在做什么,或者没有做你想要的事情。 - DSM
最小的时间格式是秒,因为一分钟有60秒,需要特殊处理。毫秒方面,我不明白问题在哪里? - Tom
啊,我现在明白问题了,是的,这确实是一个问题,我认为没有一种优雅的解决方案。 - Tom
实际上,您将不得不自己创建适当间隔宽度的xtickmarks(这就是我在下面的示例中获取x刻度标签的方式)。 - Martin
顺便提一下,由于您有6位数字,我们所说的是微秒而不是毫秒。 - Evgeniy Berezovsky
4个回答

21
根据 gnuplot 4.6手册中的 "时间/日期说明符" (gnuplot 4.6 PDF 的第114页):

%S - 秒, 输出为整数0至60,输入时为(double)

这意味着当读取时间戳时,例如2013-09-16 09:56:59.412, 小数部分将作为 %S 说明符的一部分。可以使用如下命令正确处理此类时间戳:
set timefmt "%Y-%m-%d %H:%M:%S"
set datafile separator ","
plot "timed_results.data" using 1:2 title 'Results' with lines

并被喂养了诸如以下数据:

2013-09-16 09:56:53.405,10.947
2013-09-16 09:56:54.392,10.827
2013-09-16 09:56:55.400,10.589
2013-09-16 09:56:56.394,9.913
2013-09-16 09:56:58.050,11.04

1
这是一个非常好的答案,直接回答了手头的问题 - 如何让gnuplot识别毫秒值...这里是正1。 - Xofo
这对于读取时间数据很有效,但写入时间数据效果不佳。例如,set format x "%H:%M:%S"与同一秒内的数据结合使用会导致所有x刻度标记具有相同的值。例如,得到的是“09:56:53”,“09:56:53”,“09:56:53”,而不是“09:56:53.4”,“09:56:53.5”,“09:56:53.6”。 - TrentP
我有一个gnuplot 5.2版本,这个解决方案对我不起作用:当我使用这种数据格式时,我会收到错误信息“x范围无效”。 - Shadasviar

12

你可以使用以下代码设置刻度格式:

set format x '%.6f'

或者(也许我没有尝试过,因为我现在更喜欢使用Matplotlib并且我的机器上没有安装gnuplot):

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

(注意在%S格式字符串后面指定的数字位数)。

更多细节可以在出色的不太常见的问题中找到。


1
这对我不起作用。我从原始帖子中复制了数据,并发出了您的 set timefmt "%Y-%m-%d-%H:%M:%.6S 命令。虽然此格式被接受,但当我运行 plot 命令时,所有数据点都会显示 warning: Bad time format in string - Xander Dunn
1
如果我从 timefmt 中删除 .6,然后从我的数据中删除小数位,那么它就可以工作了。gnuplot 实际上似乎无法处理非整数秒。 - Xander Dunn
3
gnuplot 4.6会将 %S 解释为 double,这意味着小数秒会被正确地解释。 - PP.

1

我最初误解了你的问题。我认为gnuplot中时间格式的更细分辨率是一个大问题,而且据我所知还没有实现。

一个可能的解决方法是使用awk将你的日期转换为秒数,类似于:

plot  "<awk 'your_awk_one_liner' file1.dat" with lines

然后只需进行常规的双倍绘图,忘记它曾经存在过(有点像马丁的解决方案)。 我不太擅长awk,所以无法帮助这一部分 - 这些页面可能会有所帮助 - http://www.gnu.org/manual/gawk/html_node/Time-Functions.htmlhttp://www.computing.net/answers/unix/script-to-convert-datetime-to-seco/3795.html。 在gnuplot中使用awk的方法在这里描述:http://t16web.lanl.gov/Kawano/gnuplot/datafile3-e.html

你可以绘制第二个轴(而不是数据)来显示正确的时间 - 类似于此处使用的方法:Is there a way to plot change of day on an hourly timescale on the x axis? 恐怕我没有时间尝试编写完整的解决方案,但应该可以做些合理的东西。
祝好运 - 如果您成功了,请保持更新 - 我会感兴趣的。

1

我在使用gnuplot进行相同的目的,我的输入看起来像:

35010.59199,100,101
35010.76560,100,110
35011.05703,100,200
35011.08119,100,110
35011.08154,100,200
35011.08158,100,200
35011.08169,100,200
35011.10814,100,200
35011.16955,100,110
35011.16985,100,200
35011.17059,100,200

第一列是从午夜开始的秒数,逗号后面是纳秒部分。您可以将其保存在CSV文件中,并在gnuplot中执行以下操作:

set datafile separator ','
plot "test.csv" using 1:3 with lines

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接