如何在Gnuplot中每个月获得xtic?

如何在Gnuplot中每个月获得xtic?,gnuplot,Gnuplot,我正在绘制一张图表,显示过去12个月内每天的最高温度,使用: set format x "1 %b" set xrange[time(0)-3600*24*365:time(0)] 这将为每个月提供一个xtic:1月1日、2月1日、3月1日 但是如果我试着将图表扩展到过去13个月,我只会每第二个月得到一次xtics:1月1日,3月1日,5月1日 set format x "1 %b" set xrange[time(0)-3600*24*(365+31)

我正在绘制一张图表,显示过去12个月内每天的最高温度,使用:

set format x "1 %b"
set xrange[time(0)-3600*24*365:time(0)]
这将为每个月提供一个xtic:1月1日、2月1日、3月1日

但是如果我试着将图表扩展到过去13个月,我只会每第二个月得到一次xtics:1月1日,3月1日,5月1日

set format x "1 %b"
set xrange[time(0)-3600*24*(365+31):time(0)]

在这种情况下,如何每月获得一次xtic?

据我所知,在您的特殊情况下,gnuplot的“autotic”仅每隔两个月放置一次tic。现在,如果您想每1个月强制一次tic,您就很难做到月份长度不相等,并且您不能简单地设置固定距离,例如,像
设置xtics 3600*24*31

也许有一个简单的解决办法,我不知道。因此,以下解决方法的想法是在循环中“手动”设置TIC。 基本上,您每天循环并创建一个字符串,其中只包含一个月的第一个或第十五个tics。 根据您的日期输入格式,您可能需要进行一些调整。 检查
help xtics
help宏

更新:正如@maij在评论和回答中提到的,有一个简单的(r)解决方案

代码:(编辑:现在使用输入时间格式dd.mm.yyyy

结果:


据我所知,在您的特殊情况下,gnuplot的“自动tic”仅每隔两个月放置一次tic。现在,如果您想每1个月强制一次tic,您就很难做到月份长度不相等,并且您不能简单地设置固定距离,例如,像
设置xtics 3600*24*31

也许有一个简单的解决办法,我不知道。因此,以下解决方法的想法是在循环中“手动”设置TIC。 基本上,您每天循环并创建一个字符串,其中只包含一个月的第一个或第十五个tics。 根据您的日期输入格式,您可能需要进行一些调整。 检查
help xtics
help宏

更新:正如@maij在评论和回答中提到的,有一个简单的(r)解决方案

代码:(编辑:现在使用输入时间格式dd.mm.yyyy

结果:


要在每个月的第一天放置XTIC,请尝试:

set format x "%d %b"
set xtics 60*60*24*30
也许

set mxtics 2 
在月中旬或接近月中举行一次xtic


如果您制作屏幕截图并计算像素数,或者拿尺子在屏幕上测量月与月之间的距离,您将看到它们不是等距的,而是与相应月份的长度成比例的。

要在每个月的第一天放置XTIC,请尝试:

set format x "%d %b"
set xtics 60*60*24*30
也许

set mxtics 2 
在月中旬或接近月中举行一次xtic


如果你做一个屏幕截图并计算像素,或者拿一把尺子在屏幕上测量月份之间的距离,你会发现它们不是等距的,而是与相应月份的长度成比例的。

我认为有一种更简单的方法。假设你有一个已知范围内x上的时间数据

 set xdata time
 set timefmt "%d.%m.%Y"        # Data in format dd.mm.yyyy
 set xrange ["01.01.2020" : "01.07.2021"]
现在我们要标记某些TIC(每月的第一天)。我们将定义tic标签整整两年,但只有在范围内的标签才会被打印出来

unset mxtics; unset ytics
set xtics (0)    # Clear out list of xtic labels
set for [mon=1:12] xtics add (strptime("%d.%m.%Y", sprintf("01.%02d.2020",mon)))
set for [mon=1:12] xtics add (strptime("%d.%m.%Y", sprintf("01.%02d.2021",mon)))
最后,您可以为实际的tic标签选择不同的格式

 set xtics time format "%b"           # Just the month name
 plot x

我认为有一个更简单的方法。假设你有一个已知范围内x上的时间数据

 set xdata time
 set timefmt "%d.%m.%Y"        # Data in format dd.mm.yyyy
 set xrange ["01.01.2020" : "01.07.2021"]
现在我们要标记某些TIC(每月的第一天)。我们将定义tic标签整整两年,但只有在范围内的标签才会被打印出来

unset mxtics; unset ytics
set xtics (0)    # Clear out list of xtic labels
set for [mon=1:12] xtics add (strptime("%d.%m.%Y", sprintf("01.%02d.2020",mon)))
set for [mon=1:12] xtics add (strptime("%d.%m.%Y", sprintf("01.%02d.2021",mon)))
最后,您可以为实际的tic标签选择不同的格式

 set xtics time format "%b"           # Just the month name
 plot x

您的输入日期格式是什么?Unix时间戳或dd.mm.yyyy或其他内容?是的,dd.mm.yyyy请修改答案…您的输入日期格式是什么?Unix时间戳或dd.mm.yyyy或其他什么?是的,dd.mm.yyyysee修改了答案…你可以写
3600*24*30
,gnuplot会发现你希望在每个月的第一个月有TIC。我真正喜欢你的答案是
stats u timecolumn
的东西。对我来说,它解决了“Stats command not available in timedata mode”(统计命令在时间数据模式下不可用)的错误,我通常在
set xdata time
@maij Right中看到这个错误,看起来你可以指定
set xtics 3600*24*d timedate
其中
28你可以写
3600*24*30
,gnuplot会发现你希望在每个月的第一个月有tics。我真正喜欢你的答案是
stats u timecolumn
的东西。对我来说,它解决了“Stats command not available in timedata mode”(统计命令在时间数据模式下不可用)错误,这是我通常在@maij中看到的错误。对了,看起来你可以指定
set xtics 3600*24*d timedate
其中
28是的,这要简单得多。只有当你明确地想要在30天内抽搐。。。那么gnuplot比用户更“聪明”…;-)@西奥日可能太聪明了。我预计在绘制月相图或类似图时会出现问题。省略
set mxtics 2
会得到两个mxtics,分别在每月11日和21日,这比月中/接近月中的mxtic要好。如果我们写入
set xrange[time(0)-3600*24*(365+strftime(“%d”,time(0))-1):time(0)
],图形将从1开始。从第一个月开始,到今天结束。是的,这要简单得多。只有当你明确地想要在30天内抽搐。。。那么gnuplot比用户更“聪明”…;-)@西奥日可能太聪明了。我预计在绘制月相图或类似图时会出现问题。省略
set mxtics 2
会得到两个mxtics,分别在每月11日和21日,这比月中/接近月中的mxtic要好。如果我们写入
set xrange[time(0)-3600*24*(365+strftime(“%d”,time(0))-1):time(0)
],图形将从1开始。从第一个月开始,到今天结束。