4

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

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

感谢您对此的任何帮助。

4

1 回答 1

4

我觉得这不可能是预期的行为,但是对于您的特定情况(因为日期是第一个),您可以这样做:

plot 'test.dat' u 1:($2/$1) w l

例如:

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,它只接受它知道如何处理的东西——the——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(例如,2000 年 1 月1日加上 ~30 秒。) . 因此,除以它对情节没有任何影响。

于 2013-11-06T07:33:52.097 回答