7.3 CPT文件格式

CPT文件有两种类型,一种适用于分类型数据,一种适用于常规数据。下面会逐一介绍。

7.3.1 分类CPT文件

分类CPT文件适用于有分类型数据,对于这些数据而言,常规的数值操作是未定义的。比如,将陆地分成不同的类型,沙漠、森林、冰川等等,定义沙漠对应的值是1,森林对应的值是2,冰川定义的值是3。显然值取1.5是没有意义的。

对于这种分类型数据,需要给每个分类指定一个 <key> 。CPT文件中则规定了每个 <key> 所对应的颜色或填充图案,以及一个可选的标签(通常是类型名)。

分类CPT文件的格式为:

<key1>      <fill1>     [;<label1>]
<key2>      <fill2>     [;<label2>]
...
<keyn>      <filln>     [;<labeln>]

几点说明:

  1. <key> 必须单调递增但不必连续
  2. <fill> 可以是颜色,也可以是图案,见 填充 一节
  3. 标签名以分号开头

<key> 可以取几个特殊的值:

  • B:小于 <key1> 的值的颜色,即背景色,默认值由 COLOR_BACKGROUND 控制
  • F:大于 <keyn> 的值的颜色,即前景色,默认值由 COLOR_FOREGROUND 控制
  • N:值为 NaN 所对应的颜色,默认值由 COLOR_NAN 控制

下面是一个分类CPT文件的示例:

0  yellow  ;desert
1  green   ;forest
2  red     ;iceland

7.3.2 常规CPT文件

对于连续变化的数据而言,可以为几个特定值指定颜色,其他值的颜色则通过插值计算得到。此时可以使用常规CPT文件。常规CPT文件的格式为:

<z0>     <color_min_1>  <z1>   <color_max_1>    [<A>]    [;<label>]
<z1>     <color_min_2>  <z2>   <color_max_2>    [<A>]    [;<label>]
...
<zn-1>   <color_min_n>  <zn>   <color_max_n>    [<A>]    [;<label>]
B   <fill_back>
F   <fill_fore>
N   <fill_NaN>

以CPT文件中的第一行为例,其定义了一个Z值切片,切片范围为 <z0><z1>,切片内每个Z值的颜色由 <color_min_1> 线性渐变为 <color_max_1> 。其他行同理。几点说明:

  1. <z> 值必须单调递增
  2. 每行的最大 <z> 必须与下一行的最小 <z> 相同,即Z切片之间不能存在间断
  3. <color_min_1><color_max_1> 相等,则 <z0><z1> 范围内的所有Z值均使用相同的颜色
  4. <color_min_1> 使用了图案,则 <color_max_1> 必须设置为 -
  5. <A> 是可选的,用于表明在使用 psscale 命令绘制色标时要如何标注。 <A> 可以取 LUB,表示选择每个Z切片的下限、上限或者上下限作为标注。
  6. ;<lable> 是切片的标签,当 psscale 使用 -L 选项时会在用 <label> 作为标注
  7. B|F|N 语句分别用于设置背景色(默认值为 COLOR_BACKGROUND )、前景色(默认值为 COLOR_FOREGROUND )和 NaN值的颜色(默认值为 COLOR_NAN
  8. B|F|N 语句要放在CPT文件的开头或结尾

下面是一个常规CPT文件的示例:

30    p16+200  80   -
80    -        100  -
100   200/0/0  200  255/255/0
200   yellow   300  green

本例中

  • 30<z<80:以200dpi分辨率的16号图案填充
  • 80<z<100:直接跳过
  • 100<z<200:从深红色线性变化成黄色
  • 200<z<300:从黄色线性变化成绿色

7.3.3 周期性CPT文件

有一类特殊的CPT文件称之为周期性CPT文件。对于这类CPT文件而言,GMT在根据Z值查找对应的颜色时,会首先从Z值中减去CPT文件中Z值范围的整数倍,使得Z值永远落在CPT 文件所指定的范围内。这意味着此类CPT文件没有前景色和背景色。

比如,现在有一个周期性CPT文件,其定义了Z值范围在 \(-\pi\)\(\pi\) 之间的颜色表。若Z值等于 \(3/2\pi\) ,则会取 \(-\pi/2\) 处的值作为其颜色。

在使用 makecptgrd2cpt 生成CPT文件时加上 -Ww 选项即可生成周期性 CPT文件。该选项本质上是在CPT文件中加上一个特殊的注释行:

# CYCLIC

GMT在CPT中看到这一注释行时就会将该CPT当作时周期性CPT文件。

Source Code

../../_images/format-gmtplot-0.png

7.3.4 动态CPT

GMT 内置的 CPT 文件都是动态的。

所有动态CPT文件都按照两种方式中的一种进行了归一化:

  1. 如果为存在分界(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

  2. 如果不存在颜色的分界,则CPT的z值归一化为0到1之间。实际使用中,CPT的z值会拉伸到用户指定的范围,包括两种拉伸模式:

    1. 默认指定一个数值范围,实际应用中(如地形渲染)再拉伸到真实值。见CPT文件中的RANGE注释:

      # RANGE = <zmin/zmax>
      
    2. 若未给定范围,则扩展到数据的极限值

下图展示了动态的内置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
../../_images/format-gmtplot-1.png

原始的内置CPT(globe,上图)的初始范围为-10000至10000,颜色不连续处的分界值(hinge)为0,小于0的部分为海蓝色系,大于0的部分为大地色系。但实际上,我们要绘制的区域高程值是非对称的,从-8000米到3000米(下图)。由于hinge值的存在,负高程依旧由海蓝色拉伸填充,正高程则由大地色压缩填充。

注:若要实现hinge分界效果,makecpt 命令中的 -T 选项不可设置 /<z_int>