-w 选项

贡献者:

周茂, 姚家园, 田冬冬


-w 选项用于将输入坐标转换为循环坐标,其语法为:

-wy|a|w|d|h|m|s|cperiod[/phase][+ccol]

-w 选项默认将输入的 x 坐标转换为循环坐标。 可以使用 +ccol 子选项选择其他输入列进行转换,col 的默认值为 0(第一列),即 x 坐标。 可以使用 spectrum1d 或者 grdfft 等模块提供的标准谱分析工具 来分析时间序列数据的周期,但也经常会在时域中分析各种周期性。 为了进行此类时域分析,我们需要将时间序列的时间坐标转换为循环的时间坐标, 以便进行多周期堆叠、网格化以及直方图展示等操作。 将输入的 x、y 或者 z 坐标转换为循环坐标的公式为:

\[ t' = (t - \tau) \;\mathrm{mod}\; T, \]

式中,t 为输入坐标,\(\tau\) 为相移(通常为 0),T 为生成 循环坐标 \(t'\) 的周期,\(\mathrm{mod}\) 为取模运算。

GMT 提供了很多规定单位的标准时间循环以及用于其他笛卡尔坐标的自定义循环。 下表给出了每种循环的单位、周期以及相移。 用户在使用时,只需指定相应的代码 yawdhmscperiod[/phase]:

标准时间循环代码

代码

含义单位

周期

相位

范围

y

年循环(归一化)

1 年

0

0–1

a

年循环(月)

1 年

0

0–12

w

周循环(天)

1 周

0

0–7

d

天循环(小时)

1 天

0

0–24

h

小时循环(分钟)

1 小时

0

0–60

m

分钟循环(秒)

1 分

0

0–60

s

秒循环(秒)

1 秒

0

0–1

c

自定义循环(归一化)

\(T\)

\(\tau\)

0–1

使用自定义循环 c 时,必须指定其周期(period),也可以指定相位(phase)[默认为 0], 周期和相位的单位与原始数据相同,-w 选项不能包含单位。

备注

  • 使用年循环(a 代码)或周循环(w 代码)时,横轴为时间轴。 因此,可以使用与月份和工作日相关的配置参数, 如 GMT_LANGUAGEFORMAT_TIME_PRIMARY_MAP 以及 TIME_WEEK_START

  • 周循环(w 代码)中范围为 0-1 的坐标代表一周的第一天(即星期一), 但可以通过 TIME_WEEK_START 进行修改

  • 使用 -w 选项时,除非已经单独设置,否则 GMT 会自动设置 -f 选项来表明使用的是绝对时间

下面将通过密西西比河在 1930–1940 年期间的日流量来演示 -w 选项的使用方法。

#!/usr/bin/env bash
gmt begin GMT_cycle_1
    gmt plot @mississippi.txt -JX15cT/7c -W0.25p,red -Bxaf -Byaf+l"10@+3@+ m@+3@+/s" \
        -BWSrt+t"Mississippi river daily discharge" -i0,1+s1e-3
gmt end show
../../_images/63a30de74fb2d4e8027192a2276517bb.png

密西西比河日流量时间序列图

上图绘制了密西西比河日流量的时间序列,可以看出有明显的周年特征。 因此,可以使用归一化年坐标(-wy)将所有年份的日流量绘制在单个归一化年份中(范围为 0–1)。 下图中,常规年和闰年都按自身长度进行了归一化:

#!/usr/bin/env bash
gmt begin GMT_cycle_2
    gmt plot @mississippi.txt -R0/1/0/50 -JX15c/7c -W0.25p,red -Bxaf -Byaf+l"10@+3@+ m@+3@+/s" \
        -BWSrt+t"Mississippi river annual discharge" -i0,1+s1e-3 -wy
gmt end show
../../_images/11530f6350cd186a36eb015cc5e049b4.png

归一化年份下的密西西比河日流量时间序列图

如果想看不同月份的流量变化,则需要将同一月份的数据归入同一区间(每个区间的长度不同,即 28-31 天)。 这种情况可以使用 -wa 选项,它会归一化每月的数据,并加上整数的月份编号。 以三月份为例:该选项会将所有年份的三月份数据的 x 坐标(以三月的起点起算)按三月份的时间长度归一化, 然后再加 2(三月份的编号),最终所有年份的三月份数据的 x 坐标的范围便为 2.00000-2.99999…。 这样一来,我们便能很容易地绘制月流量直方图:

#!/usr/bin/env bash
gmt begin GMT_cycle_3
    gmt histogram @mississippi.txt -R-3/9/0/8 -JX15c/7c -T1 -Gred -W1p -Bxaf -Byaf+l"10@+6@+ m@+3@+/s" \
        -BWSrt+t"Average monthly discharge" -Z0+w -i0,1+s1e-6 -wa
gmt end show
../../_images/6bbd291976604988d2da9830a22d4b51.png

10 年间的密西西比河月流量(以 9 月为起点)

histogram 模块的 -T1 参数改为 -T3,则可以绘制类似的季度流量直方图。

通过设置 +ccol 子选项,-w 选项同样可以应用于 y 坐标或者任意坐标。 下例读入数据时,将时间设为 y 坐标。两个子图与上面的两个例子类似,但横纵坐标相反。

#!/usr/bin/env bash
gmt begin GMT_cycle_4
    gmt subplot begin 1x2 -Fs8c/10c -BWSrt -T"Mississippi river annual discharge" -A+jTR
    gmt plot @mississippi.txt -i1+s1e-3,0 -R0/50/0/1 -W0.25p,blue -Byaf+l"Normalized year" \
        -Bxaf+l"10@+3@+ m@+3@+/s" -wy+c1 -c
    gmt histogram @mississippi.txt -R-3/9/0/8 -T1 -Gblue -W1p -Bxaf -Byaf+l"10@+6@+ m@+3@+/s" -Z0+w \
        -i0,1+s1e-6 -A -wa -c --FORMAT_TIME_PRIMARY_MAP=a
    gmt subplot end
gmt end show
../../_images/bae32f873eed1871b68a63da8089e24d.png

a)归一化后一年内的密西西比河日流量,b)10 年的密西西比河月流量,以 9 月为起点

-w 选项为 GMT 全局选项,因而可以在所有可以读取表数据的模块中使用该选项。 例如,下例使用 xyz2grd 模块将密西西比河日流量数据转换成网格文件, 然后使用 grdimage 模块绘图(使用默认 CPT,即 turbo)。

#!/usr/bin/env bash
gmt begin GMT_cycle_5
    gmt xyz2grd @mississippi.txt -i0,1+s1e-3,1+s1e-3 -wy -R0/1/0/50 -I50+n -r -Gtmp.grd
    gmt grdimage tmp.grd -JX15c/8c -BWSen -Bxaf+l"Normalized year" -Byaf+l"Discharge (10@+3@+ m@+3@+/s)"
    gmt colorbar -DJRM -Baf
gmt end show
../../_images/b913989834bb90a4cee9b6562c89522e.png

归一化年份下的密西西比河日流量

最后一个示例将展示周循环和日循环的使用。 使用的数据是 Verrazano-Narrows 大桥的 3 年的车流量数据(单位是辆/小时)。 下例的四张子图分别表示原始车流量时间序列、周流量时间序列、周流量直方图以及小时流量直方图:

#!/usr/bin/env bash
gmt begin GMT_cycle_6
  gmt set TIME_WEEK_START Monday
  gmt subplot begin 2x2 -Fs15c/8c -M14p/6p -A \
    -T"Verrazzano-Narrows Bridge @%34%\337@%% Brooklyn Traffic [2018-2020]" -BWSrt
    # Raw time-series
    gmt plot @NY_traffic.txt -Wfaint,red -By+l"Vehicles/hour" -gx21600 -c
    # Weekly wrapped time-series
    gmt plot @NY_traffic.txt -R0/7/0/17000 -Wfaint,red -ww -gx0.25 -c
    # Weekly histogram normalized for number of hours for a weekday in the 3-year data
    n_week_hours=$(gmt convert @NY_traffic.txt -ww | gmt select -Z0/0.999+c0 | gmt info -Fi -o2)
    gmt histogram @NY_traffic.txt -R0/7/2000/4000 -Wthick -Gred -T1 -Z0+w -By+l"Vehicles/hour" \
        -i0,1+d${n_week_hours} -ww -c
    # Daily histogram normalized for number of days in the 3-year data
    n_mondays=$(gmt convert @NY_traffic.txt -wd | gmt select -Z-0.5/0.5+c0 | gmt info -Fi -o2)
    gmt histogram @NY_traffic.txt -R0/24/0/8000 -Wthick -Gred -T1 -Z0+w -i0,1+d${n_mondays} -wd -c
  gmt subplot end
gmt end show
../../_images/9db7b3836d050ca876479a9998b07437.png

(a)Verrazano-Narrows 大桥原始车流量时间序列;(b)周流量时间序列;(c)周流量直方图;(d)小时流量直方图

上图中,(a)图绘制了三年期间的车流量时间序列。图中一些需要注意的点有: Covid-19 导致了 2020 年 3 月中旬车流量的急剧下降;某些时间段存在数据缺失; 2018 年 5 月可能出现了一个尖峰。使用 -g 选项以避免绘制数据缺失超过 6 小时的时窗。

(b)图绘制了周车流量时间序列(-ww)。 可以看出,工作日存在明显的早晚高峰,周末与工作日的特征则有所不同。 图(a)中的尖峰来自某个异常的周四和周日,这两天的数据可能有问题。 同样,使用 -g 选项以避免绘制数据缺失超过 6 小时的时窗。

(c)图绘制了车周流量直方图。可以看出,车流量在周中缓慢增加,在周末下降。 绘图脚本计算了数据中属于第一个工作日(-Z0/0.999+c0)的所有小时数, 用于归一化车流量数据(+d${n_week_hours}),使最终单位为辆/小时

(d)图绘制了小时车流量直方图(-wd)。 绘图脚本计算了数据中属于第一个小时(-Z-0.5/0.5+c0)的数目(即天数), 用于归一化车流量数据(+d${n_mondays}),使最终单位为辆/小时