我觉得这不可能是预期的行为,但是对于您的特定情况(因为日期是第一个),您可以这样做:
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 秒。) . 因此,除以它对情节没有任何影响。