首页 > 解决方案 > Gnuplot:为时间戳数据设置 X 轴标签的起点

问题描述

在 Gnuplot 中,我正在绘制带时间戳的值。数据如下所示:

2019-06-01 18:23:56, 508.56
2019-06-07 18:23:56, 508.56
2019-06-08 13:00:00, 492.95
...

我不希望 xtics 标签太密集,所以我每 2 周打印一次:

set xdata time
set timefmt "%Y-%m-%d %H:%M:%S"
set xtics format "%m/%d"
set xtics 3600*24*15
unset mxtics

它有效,标签的间隔为 2 周,但它们与月初的对齐方式并不令人满意。我看到的 xtics 标签是:06/13、06/28、07/13 等。我想从一个月的第一天开始标记,然后是一个月的 15 号等。我的实际数据从 2019 年开始-06-07。我为 2019-06-01 添加了一个假的第一个条目(见上文),但我得到了相同的标签序列(06/13、06/28 等)。有没有一种方法可以设置第一个 xtics 点的位置(06/01 或 06/15),而无需在数据文件中手动指定“xticslabels”?

标签: timeformatgnuplot

解决方案


您可以通过为每个月内第一次出现的“01”或“15”定义过滤函数来自己设置抽动,NaN否则返回。

编辑:更改测试数据以说明有些月份有 30 天,有些月份有 31 天,而 2020 年 2 月有 29 天。

Edit2:注释后修改代码。

代码:

### Fixed time step "xtics" on 01 and 15 of each month
reset session

myTimeFmt = "%Y-%m-%d %H:%M:%S"

# create some test data
set samples 181
set table $Data
    plot [0:1] '+' u (a=strftime(myTimeFmt, time(0)+$1*3600*24*180)):(a[9:10]) w table
unset table

set grid xtics, ytics

flag=0
myTic(s) = (s[9:10] eq "01") && (flag==0 || flag==15) ? \
    (flag=1, strftime("%m/%d",strptime(myTimeFmt,s))) : \
    (s[9:10] eq "15") && (flag==0 || flag==1) ? \
    (flag=15, strftime("%m/%d",strptime(myTimeFmt,s))) : NaN

set xdata time
set timefmt myTimeFmt
set xrange["2019-10-01":"2020-04-30"]

plot $Data u (timecolumn(1,myTimeFmt)):3: \
        xtic(myTic(strftime(myTimeFmt,timecolumn(1,myTimeFmt)))) w lp pt 7 notitle, \
### end of code

结果:

在此处输入图像描述


推荐阅读