Gnuplot使用日期栏的部分/除以天

时间:2013-11-06 02:03:59

标签: time gnuplot

我有一个这样的数据文件:

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

感谢您提供任何帮助。

1 个答案:

答案 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秒。)。因此,除以它在图中没有任何区别。