如何在gnuplot 5.4中绘制月数?

如何在gnuplot 5.4中绘制月数?,gnuplot,Gnuplot,我试图在gnuplot 5.4中获取日期的月份 考虑以下数据: 2019/01/01 2019/02/01 2019/03/01 2019/04/01 2019/05/01 2019/06/01 2019/07/01 2019/08/01 2019/09/01 2019/10/01 2019/11/01 2019/12/01 2020/01/01 2020/02/01 2020/03/01 2020/04/01 2020/05/01 2020/06/01 2020/07/01 2020/08/0

我试图在gnuplot 5.4中获取日期的月份

考虑以下数据:

2019/01/01
2019/02/01
2019/03/01
2019/04/01
2019/05/01
2019/06/01
2019/07/01
2019/08/01
2019/09/01
2019/10/01
2019/11/01
2019/12/01
2020/01/01
2020/02/01
2020/03/01
2020/04/01
2020/05/01
2020/06/01
2020/07/01
2020/08/01
2020/09/01
2020/10/01
2020/11/01
2020/12/01
对于每个数据点,我想在
x
轴上显示完整日期,在
y
轴上显示月数(0-11)

gnuplot文档建议对此类任务使用,它应该返回给定日期的月份号

据我所知,以下gnuplot脚本应该满足我的要求:

#!/bin/gnuplot
set timefmt '%Y/%m/%d'
set xdata time
set format x '%m/%y'
set datafile separator ','

plot "data.csv" using 1:(tm_mon($1)) title 'data'
但事实并非如此。此gnuplot脚本在
x
轴上正确显示日期,但在
y
轴上有一个常量
0


我做错了什么?为什么
tm\u mon($1)
总是返回0?

我不确定我是否完全理解你的意图。 我知道您希望列1作为xtic标签。 但是,将列1作为xtic标签或将列1解释为日期/时间并相应地缩放x轴之间存在差异,gnuplot将自动关注xtic标签。 对于第一种情况,图形的宽度可能不够宽,无法显示没有重叠的所有标签,因此,我重新格式化了日期。检查
帮助strtime
帮助strtime
。顺便说一句,
help tm\u mon
说它需要以秒为单位输入,而不是像
$1
中那样以日期格式输入,
strtime()

我知道您希望在一年中的几个月内,Y范围从1到12。 但是,您要绘制的数据在哪里? 也许下面的例子是更好地了解你真正想要什么的起点

代码:

### plotting dates...
reset session

$Data <<EOD
2019/01/01
2019/02/01
2019/03/01
2019/04/01
2019/05/01
2019/06/01
2019/07/01
2019/08/01
2019/09/01
2019/10/01
2019/11/01
2019/12/01
2020/01/01
2020/02/01
2020/03/01
2020/04/01
2020/05/01
2020/06/01
2020/07/01
2020/08/01
2020/09/01
2020/10/01
2020/11/01
2020/12/01
EOD

myTimeInputFmt = "%Y/%m/%d"
myTimeOutputXFmt = "%Y\n%m\n%d"
set xlabel "Date"
set format x myTimeOutputXFmt   # to get enough space for the 3 lines of the label

set ylabel "Month"
set yrange [0.5:12.5]
set ytics 1

plot $Data u 0:(tm_mon(strptime(myTimeInputFmt,strcol(1)))+1): \
             xtic(strftime(myTimeOutputXFmt,strptime(myTimeInputFmt,strcol(1)))) \
             with points pt 7 lc "red" title 'data'
### end of code
###绘图日期。。。
重置会话
$Data正确读取数据的另一种方法
gnuplot中还有函数“timecolumn(N,“timeformat”)”,尽管它只能在
中使用
。这是用于将第n列输入数据作为日期时间读取的函数。如果使用
set timemt
提供的格式,则此函数的第二个参数是可选的。使用它,您的脚本将通过以下脚本工作

#!/bin/gnuplot
set timefmt '%Y/%m/%d'
set xdata time
set format x '%m/%y'
set datafile separator ','

plot "data.csv" using 1:(tm_mon(timecolumn(1))) title 'data'
为什么tm_mon($1)不断返回0? 在脚本中,从“data.csv”读取第一行时,
tm\u mon($1)
被解释为
tm\u mon(“2019/01/01”)
tm_mon
基本上接受表示UNIX时间的实际值作为参数。但是,如果给定了字符串值,
tm_mon
尝试将其转换为实际值并解释为UNIX时间。所以,
tm_mon
不会一直返回0。您可以通过尝试以下命令来理解此行为

gnuplot> print tm_mon(1607698800)    ### 2020-12-12 in UNIX time
11.0
gnuplot> print tm_mon("1607698800")
11.0
gnuplot> print tm_mon("1607698800/05/06")
11.0

欢迎来到StackOverflow!你说的是x轴和y轴标签,对吗?但是,您想要绘制的实际数据是什么,在哪里?您的结果正是我想要生成的(我遇到的错误的最小复制器)。我的错误来自于这样一种假设:既然gnuplot能够正确解析date列的数据,那么它就能够在传递给tm_mon时弄清楚如何处理它。谢谢你的帮助!