gnuplot:绘图时不正确的时间数据(儒略日期,x 轴)

gnuplot: incorrect time data (julian date, x-axis) when plotting

我正在尝试使用 gnuplot 将数据绘制为时间的函数。我遇到时间数据(x 轴)不正确的问题。此问题类似于 posted here,但 post 似乎无法解决我的问题。

首先,这里是显示错误的文件 "data.txt" 的一个子集

996,1.81014336621038094E+07,1.04721577434964254E+07
997,1.81073887058396861E+07,1.04688883975542113E+07
998,1.81123550412347727E+07,1.04660263576711770E+07
999,1.81165058190760165E+07,1.04628236696091276E+07
1000,1.81200135215993598E+07,1.04593579882744774E+07
1001,1.81230027468293682E+07,1.04556943748914227E+07
1002,1.81256090021481551E+07,1.04518411259850748E+07
1003,1.81280483217409961E+07,1.04478383895292878E+07
1004,1.81311435732491128E+07,1.04439282290004119E+07

第一列对应儒略日期,第 2 列和第 3 列包含数据。为了绘制数据,我使用了以下交互式 gnuplot 命令:

set datafile separator ","
set terminal png
set xdata time
set timefmt "%j"
set output "test_figure.png"
plot "data.txt" using 1:2 with lines lw 2 lt 1

这会产生以下情节: Figure with incorrect timeseries

如果我将 data.txt 文件更改为(唯一的区别是前 4 行第一列中的前导零),我会得到正确的数字:

0996,1.81014336621038094E+07,1.04721577434964254E+07
0997,1.81073887058396861E+07,1.04688883975542113E+07
0998,1.81123550412347727E+07,1.04660263576711770E+07
0999,1.81165058190760165E+07,1.04628236696091276E+07
1000,1.81200135215993598E+07,1.04593579882744774E+07
1001,1.81230027468293682E+07,1.04556943748914227E+07
1002,1.81256090021481551E+07,1.04518411259850748E+07
1003,1.81280483217409961E+07,1.04478383895292878E+07
1004,1.81311435732491128E+07,1.04439282290004119E+07

Figure with correct timeseries

有没有一种方法可以让我编写不需要前导零的 gnuplot 代码?实际数据集的儒略日期为 1 到 10,000,如果我用前导零写入数据以填充 5 位数字(即 00001),我会收到 "illegal day of year" 错误。

我确实注意到 2 个图之间的 x 轴刻度标签不同(可能暗示了我遇到的问题的根源),但我无法确定出了什么问题。

注意:这个"error"只出现在我从999到1000的时候。从Julian date 9到10没有这个乱序的问题.

提前感谢您的帮助!

我不知道是什么导致了在绘图时数据被重新排序的原始问题,但我意识到我对数据的解释不正确。第一列实际上不是 Julian 日期,而是自开始日期以来的小时数。因此,值 25 并不是数据中的 25 天,而是实际上是数据中的 1 天零 1 小时。

将第一列(计数器)替换为 "day-hour":

41-12,1.81014336621038094E+07,1.04721577434964254E+07
41-13,1.81073887058396861E+07,1.04688883975542113E+07
41-14,1.81123550412347727E+07,1.04660263576711770E+07
41-15,1.81165058190760165E+07,1.04628236696091276E+07
41-16,1.81200135215993598E+07,1.04593579882744774E+07
41-17,1.81230027468293682E+07,1.04556943748914227E+07
41-18,1.81256090021481551E+07,1.04518411259850748E+07
41-19,1.81280483217409961E+07,1.04478383895292878E+07
41-20,1.81311435732491128E+07,1.04439282290004119E+07

然后使用 set timefmt "%j-%H" 让我获得了正确的情节。

让我们首先改进 x 轴标签以了解发生了什么:

set format x "%Y-%m-%d"

然后我们增加生成的 png 的分辨率,我们用线点而不是线来绘制。脚本现在看起来像这样:

set datafile separator ","
set terminal png size 1200,600
set xdata time
set timefmt "%j"
set output "test_figure.png"
set format x "%Y-%m-%d"
plot "data.txt" using 1:2 with linespoints lw 2 lt 1

这是结果:

有的点是1970年4月,有的点是1972年9月。时间格式修饰符%j表示一年中的第几天。 1970年4月的点对应第100天,1972年9月的点对应997天左右,都是从1970年1月1日,Unix纪元开始计算。

这意味着,gnuplot 将值 996 ... 999 解释为从 1970 年 1 月 1 日开始计算的天数。值 1000 ... 1004 被(错误地)读取为从 1970 年 1 月 1 日开始计算的 100 天,第四个忽略数字 (!)。

如果您在值 996 ... 999 前添加一个前导 0,它们现在被读作 99,这会使情况变得更糟。

我到此为止,因为您已经知道如何读取数据:)