如何在 Gnuplot 中获取每个月的 xtic?

How to get a xtic for every month in 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):time(0)]

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

据我了解,在您的特殊情况下,gnuplot 的“自动”仅每两个月放置一次抽动。现在,如果你想在每个月的第一天强制抽动一次,你会遇到月份长度不相等的困难,你不能简单地设置一个固定的距离,例如像 set xtics 3600*24*31.

也许有一个我不知道的简单解决方案。因此,以下解决方法的想法是在循环中“手动”设置抽动。 基本上,您每天循环并创建一个仅包含一个月 1 日或 15 日的 tic 的字符串。 根据您的日期输入格式,您可能需要进行一些调整。 检查 help xticshelp macros.

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

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

### force a tic every 1st and 15th of month
reset session
myTimeFmt = "%d.%m.%Y"

# create some random test data
set print $Data
do for [i=1:365+31] {
    print sprintf("%s %g",strftime(myTimeFmt,time(0)-i*3600*24),-i/360.+rand(0)+sin(i/36.))
}
set print

stats $Data u (timecolumn(1,myTimeFmt)) nooutput
DateStart = strptime(myTimeFmt,"01.".strftime("%m.%Y",STATS_min))  # the first day of the month
DateEnd   = STATS_max

myXtics = ''
do for [t=DateStart:DateEnd:24*3600] {
    myXtic = tm_mday(t)==1  ? sprintf('"%s" %.0f 0,',strftime("%b",t),t) : \
             tm_mday(t)==15 ? sprintf('""   %.0f 1,', t) : ''
    myXtics = myXtics.myXtic
}
set xtics (@myXtics)
set key top left

plot $Data u (timecolumn(1,myTimeFmt)):2 w l lc "red" ti "tics every 1st and 15th of the month"
### end of code

结果:

为了在每个月的第一天放置 xtics,请尝试:

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

也许

set mxtics 2 

在月中有一个 xtic in/near。

如果您截屏并计算像素,或者用尺子测量屏幕上月份之间的距离,您会发现它们不是等距的,而是与相应月份的长度成正比的。

我认为有更简单的方法。假设您有 x 跨越已知范围的时间数据。

 set xdata time
 set timefmt "%d.%m.%Y"        # Data in format dd.mm.yyyy
 set xrange ["01.01.2020" : "01.07.2021"]

现在我们要标记某些抽动(每月的第一天)。我们将为整整两年定义 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)))

最后,您可以为实际的抽动标签选择不同的格式

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