製作CPT

GMT模塊 makecptgrd2cpt 可以內置CPT文件爲基礎,針對用戶自己的數據製作專門的CPT文件;也可以將用戶自定義CPT重新調整爲一個新的範圍、顏色倒轉甚至屏蔽部分顏色的新色標文件。比如某個內置CPT文件定義了從0到1顏色從藍色變成紅色,用 makecpt 可以製作一個從1000到3000顏色從藍色變成紅色的CPT文件。不同的是, makecpt 常用於已知極值範圍的表數據,而 grd2cpt 常用於將cpt適用於一個或多個格網數據。此外,兩者均可通過以下方式翻轉顏色:

  1. 利用 -Iz 選項倒轉CPT的z值指向(不包括前景色、背景色)。用於數據的正負顏色表示和慣例不符的情況(比如用正值表示海平面以下的深度,而不是慣常的負高程)。
  2. 利用 -Ic 選項翻轉顏色的順序,包括前景色和背景色(與 colorbar 的寬度設爲負值效果一致)。
  3. -Icz 表示以上兩種效果的疊加,即顏色順序不變,只調轉了前景色和背景色
  4. 利用 -G 選項提取主CPT的一部分顏色
  5. 最後,將初始的內置CPT或修改後的CPT拉伸爲自定義數據範圍
#!/bin/bash
SIZE=w15c/0.25c

gmt begin cpt_4 pdf,png
gmt makecpt -Chaxby -T-10/10/1 -H > Icpt.cpt
gmt makecpt -Chaxby -T-10/10/1 -H -Iz > Icpt_z.cpt
gmt makecpt -Chaxby -T-10/10/1 -H -Ic > Icpt_c.cpt
gmt makecpt -Chaxby -T-10/10/1 -H -Icz > Icpt_cz.cpt

gmt plot -R1/10/1/10 -JX20c -T

gmt colorbar -CIcpt.cpt   -Dn0.5/0.25+jCM+$SIZE+h+e+n -B+l"Master CPT"
gmt colorbar -CIcpt_c.cpt -Dn0.5/0.4+jCM+$SIZE+h+e+n  -B+l"-Ic"
gmt colorbar -CIcpt_z.cpt -Dn0.5/0.55+jCM+$SIZE+h+e+n -B+l"-Iz"
gmt colorbar -CIcpt_cz.cpt -Dn0.5/0.7+jCM+$SIZE+h+e+n -B+l"-Icz"

rm Icpt*.cpt
gmt end
../_images/makecpt-gmtplot-0.png

注:這些CPT的調整選項順序也是有優先級的。比如 -Iz 使用後,所有其他的更改都是基於z值反向的前提進行的。

CPT文件可以在 grdimageplotplot3d 等命令中使用。通常,你可以使用 makecptgrd2cpt 對已有的CPT(比如GMT內置的CPT)文件進行重採樣,並適應你目前所使用的數據範圍。當然,也可以自己手寫CPT文件,或使用 awkperl 之類的文本處理工具自動生成CPT文件。由於GMT中可以用多種方式來指定顏色,因而GMT自帶的或用戶自己的CPT文件中通常含有如下注釋語句:

# COLOR_MODEL = model

其中 model 可以取 RGB、hsv、cmyk,其指定了CPT文件中的顏色要如何進行解釋。

週期性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/makecpt-gmtplot-1.png

動態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
gmt begin cpt_3 pdf,png
gmt makecpt -Cglobe -T-8000/3000
gmt colorbar -C -Baf -Dx0/0+w4.5i/0.1i+h
gmt colorbar -Cglobe -Baf -Dx0/0+w4.5i/0.1i+h -Y0.5i
gmt end
../_images/makecpt-gmtplot-2.png

原始的內置CPT(globe,上圖)的初始範圍爲-10000至10000,顏色不連續處的分界值(hinge)爲0,小於0的部分爲海藍色系,大於0的部分爲大地色系。但實際上,我們要繪製的區域高程值是非對稱的,從-8000米到3000米(下圖)。由於hinge值的存在,負高程依舊由海藍色拉伸填充,正高程則由大地色壓縮填充。

注:若要實現hinge分界效果,makecpt 命令中的 -T 選項不可設置 /<z_int>