我有一个这样的数据文件:
30/11/2012 600.00
31/12/2012 620.00
31/01/2013 640.00
28/02/2013 580.00
31/03/2013 720.23
30/04/2013 710.26
31/05/2013 800.54
30/06/2013 786.58
31/07/2013 821.82
31/08/2013 854.91
30/09/2013 849.17
31/10/2013 910.26
我想绘制这个数据,将第1列作为x轴,并在y轴上:“第2列除以第1列中的日期”。但我不知道如何提取日子。 这就是我尝试过但它似乎不起作用,即我得到与绘制1对2完全相同的图形:
set xdata time
set timefmt "%d/%m/%Y"
plot 'data.csv' u 1:($2/tm_mday($1)) w l
感谢您提供任何帮助。
答案 0 :(得分:4)
我觉得这不可能是预期的行为,但对于您的特定情况(因为日期是第一个),您可以这样做:
plot 'test.dat' u 1:($2/$1) w l
e.g:
gnuplot> set xdata time
gnuplot> set timefmt '%d/%m/%Y'
gnuplot> set term dumb
Terminal type set to 'dumb'
Options are 'feed size 79, 24'
gnuplot> plot 'test.dat' u 1:($2/$1) w l
30 +++-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+++
+ + + + + + + 'test.dat' u 1:($2/$1) ********
29 ++ ***++
| *** |
28 ++ *** ++
| *** |
27 ++ *** ++
| *********** |
26 ++ *** ++
25 ++ * ++
| ** |
24 ++ * ++
| **** |
23 ++ *** ++
| * |
22 ++ ** ++
| * |
21 ++ * ++
+ + + ********* + + + + + + + +
20 +++-+-*********-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+++
01/11/12/12/12/01/13/02/1303/13/04/13/05/13/06/13/07/1308/13/09/13/10/13/11/13
理性:我认为set xdata time
子句实际上只适用于使用规范的第一部分。当您点击使用规范($2/$1
)的第二部分时,gnuplot将恢复为正常解释所有内容。正常使用解析器是非常宽容的,所以当它看到30/11/2012
时,它只需要它知道如何处理的东西 - 30
- 并默默地忽略其余的。
根据上述假设 1 ,我提出了这个:
plot 'test.dat' u 1:($2/tm_mday(strptime('%d/%m/%Y', strcol(1)))) w l
首先,我们需要告诉gnuplot第1列中的内容是一个字符串(strcol(1)
),然后我们根据时间格式(strptime( ... )
)将其读取为时间。最后,您可以使用tm_mday
函数,因为strptime完成了将数据转换为tm_mday
所需格式的所有艰苦工作。
1 请注意,我的上述假设也解释了您在原文中看到的行为。如果$1
始终返回字符串的日期部分,则tm_mday
始终会看到介于1和31之间的数字。由于tm_mday
期望参数自2000年1月1日起为秒,日总是1
(例如Jan 1 ,2000加~30秒。)。因此,除以它在图中没有任何区别。