如何在 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 xtics
和 help 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
我正在绘制一个图表,显示过去 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 xtics
和 help 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