【问题标题】:gnuplot: incorrect time data (julian date, x-axis) when plottinggnuplot:绘图时不正确的时间数据(儒略日期,x轴)
【发布时间】:2017-07-26 04:48:49
【问题描述】:

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

首先,这里是显示错误的文件“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),则会收到“一年中的非法日期”错误。

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

注意:这个“错误”只出现在我从 999 到 1000 时。从儒略日期 9 到 10 没有这个乱序问题。

提前感谢您的帮助!

【问题讨论】:

    标签: datetime time gnuplot julian-date


    【解决方案1】:

    我不知道是什么导致了绘图时数据重新排序的原始问题,但我意识到我对数据的解释不正确。第一列实际上不是儒略日期,而是自开始日期以来的小时数。因此,值 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" 让我获得了正确的情节。

    【讨论】:

      【解决方案2】:

      让我们首先改进 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,这会使情况变得更糟。

      我停在这里,因为您已经弄清楚如何读取数据:)

      【讨论】:

      • 感谢您对此进行调查。我还是 gnuplot 的新手,所以这个回复非常有用/很有帮助。我仍然不知道为什么 gnuplot 读取值 1000 - 1004 不正确,但这对我来说不再是问题 :)
      猜你喜欢
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 2021-11-25
      • 2014-07-11
      • 1970-01-01
      相关资源
      最近更新 更多