7.3 制作CPT¶
GMT模块 makecpt 和 grd2cpt 可以内置CPT文件为基础,针对用户自己的数据制作专门的CPT文件;也可以将用户自定义CPT重新调整为一个新的范围、颜色倒转甚至屏蔽部分颜色的新色标文件。比如某个内置CPT文件定义了从0到1颜色从蓝色变成红色,用 makecpt 可以制作一个从1000到3000颜色从蓝色变成红色的CPT文件。不同的是, makecpt 常用于已知极值范围的表数据,而 grd2cpt 常用于将cpt适用于一个或多个格网数据。此外,两者均可通过以下方式翻转颜色:
- 利用
-Iz
选项倒转CPT的z值指向(不包括前景色、背景色)。用于数据的正负颜色表示和惯例不符的情况(比如用正值表示海平面以下的深度,而不是惯常的负高程)。 - 利用
-Ic
选项翻转颜色的顺序,包括前景色和背景色(与colorbar
的宽度设为负值效果一致)。 -Icz
表示以上两种效果的叠加,即颜色顺序不变,只调转了前景色和背景色- 利用
-G
选项提取主CPT的一部分颜色 - 最后,将初始的内置CPT或修改后的CPT拉伸为自定义数据范围
#!/bin/bash
J=X20c
R=1/10/1/10
PS=GMT_CPT_4.ps
SIZE=w15c/0.25c
gmt makecpt -Chaxby -T-10/10/1 > Icpt.cpt
gmt makecpt -Chaxby -T-10/10/1 -Iz > Icpt_z.cpt
gmt makecpt -Chaxby -T-10/10/1 -Ic > Icpt_c.cpt
gmt makecpt -Chaxby -T-10/10/1 -Icz > Icpt_cz.cpt
gmt psxy -R$R -J$J -K -T > $PS
gmt psscale -R -J -CIcpt.cpt -Dn0.5/0.25+jCM+$SIZE+h+e+n -B+l"Master CPT" -K -O >> $PS
gmt psscale -R -J -CIcpt_c.cpt -Dn0.5/0.4+jCM+$SIZE+h+e+n -B+l"-Ic" -K -O >> $PS
gmt psscale -R -J -CIcpt_z.cpt -Dn0.5/0.55+jCM+$SIZE+h+e+n -B+l"-Iz" -K -O >> $PS
gmt psscale -R -J -CIcpt_cz.cpt -Dn0.5/0.7+jCM+$SIZE+h+e+n -B+l"-Icz" -K -O >> $PS
gmt psxy -R -J -O -T >> $PS
rm gmt.*
rm Icpt*.cpt
注:这些CPT的调整选项顺序也是有优先级的。比如 -Iz
使用后,所有其他的更改都是基于z值反向的前提进行的。
CPT文件可以在 grdimage、psxy、psxyz
等命令中使用。通常,你可以使用 makecpt 或 grd2cpt
对已有的CPT(比如GMT内置的CPT)文件进行重采样,并适应你目前所使用的数据范围。当然,也可以自己手写CPT文件,或使用 awk
、
perl
之类的文本处理工具自动生成CPT文件。由于GMT中可以用多种方式来指定颜色,因而GMT自带的或用户自己的CPT文件中通常含有如下注释语句:
# COLOR_MODEL = model
其中 model
可以取 RGB、hsv、cmyk,其指定了CPT文件中的颜色要如何进行解释。
7.3.1 周期性CPT文件¶
有一类特殊的CPT文件称之为周期性CPT文件。对于这类CPT文件而言,GMT在根据Z值查找对应的颜色时,会首先从Z值中减去CPT文件中Z值范围的整数倍,使得Z值永远落在CPT 文件所指定的范围内。这意味着此类CPT文件没有前景色和背景色。
比如,现在有一个周期性CPT文件,其定义了Z值范围在 \(-\pi\) 到 \(\pi\) 之间的颜色表。若Z值等于 \(3/2\pi\) ,则会取 \(-\pi/2\) 处的值作为其颜色。
在使用 makecpt
或 grd2cpt
生成CPT文件时加上 -Ww
选项即可生成周期性
CPT文件。该选项本质上是在CPT文件中加上一个特殊的注释行:
# CYCLIC
GMT在CPT中看到这一注释行时就会将该CPT当作时周期性CPT文件。
7.3.2 动态CPT¶
GMT 内置的 CPT 文件都是动态的。
所有动态CPT文件都按照两种方式中的一种进行了归一化:
如果为存在分界(hinge)的区域填色(如地形颜色在高程为0的海岸线处发生非连续的分界)那么CPT的z值在一侧为-1到0;另一侧为0到1;分界线上为0。CPT文件中对分界线的值注释如下:
# HINGE = <hinge-value>
按照这种方式归一化的内置CPT包括
earth
etopo1
geo
globe
polar
red2green
relief
sealand
split
terra
topo
world
如果不存在颜色的分界,则CPT的z值归一化为0到1之间。实际使用中,CPT的z值会拉伸到用户指定的范围,包括两种拉伸模式:
默认指定一个数值范围,实际应用中(如地形渲染)再拉伸到真实值。见CPT文件中的RANGE注释:
# RANGE = <zmin/zmax>
若未给定范围,则扩展到数据的极限值
下图展示了动态的内置CPT如何拉伸适用于用户自定义数据,绘制命令如下:
#!/bin/bash
PS=GMT_CPT_3.ps
gmt makecpt -Cglobe -T-8000/3000 > t.cpt
gmt psscale -Ct.cpt -Baf -Dx0/0+w4.5i/0.1i+h -K -P > $PS
gmt psscale -Cglobe -Baf -Dx0/0+w4.5i/0.1i+h -Y0.5i -O >> $PS
rm gmt.*
rm t.cpt
原始的内置CPT(globe,上图)的初始范围为-10000至10000,颜色不连续处的分界值(hinge)为0,小于0的部分为海蓝色系,大于0的部分为大地色系。但实际上,我们要绘制的区域高程值是非对称的,从-8000米到3000米(下图)。由于hinge值的存在,负高程依旧由海蓝色拉伸填充,正高程则由大地色压缩填充。
注:若要实现hinge分界效果,makecpt
命令中的 -T
选项不可设置 /<z_int>
。