我尝试使用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
第一列对应于Julian日期,第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代码而不需要前导零?实际数据集的Julian日期为1到10,000,如果我用前导零写数据来填充5位数(即00001),我会得到一年中非法的日期"错误。
我注意到两个图之间的x轴刻度标签不同(可能是我所遇问题来源的提示),但我无法确定出现了什么问题。
注意:此"错误"只有当我从999变为1000时才出现。从Julian日期9到10出现没有这个无序问题。
提前感谢您的帮助!
答案 0 :(得分:0)
我不知道在绘图时数据被重新排序的原始问题是什么原因,但我意识到我正在错误地解释数据。第一列实际上不是朱利安日期,而是自开始日期以来的小时数。因此,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"
让我获得了正确的情节。
答案 1 :(得分:0)
让我们首先改进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会使事情变得更糟。
我在这里停下来,因为你已经知道如何阅读数据:)