天天看點

如何優雅的使用GMT繪圖(2): 主題風格和資料路徑GMT繪圖主題風格GMT使用者目錄資料路徑

GMT繪圖主題風格

GMT的一些繪圖預設參數設定儲存在一個叫

gmt.conf

的檔案裡面,裡面有字型設定(e.g., FONT_ANNOT, FONT_ANNOT_PRIMARY),顔色設定(e.g., COLOR_BACKGROUND)等,就如同

matplotlib繪圖風格

裡面的.style檔案一樣。

個别屬性設定

如果想在GMT繪圖代碼裡面設定某一個屬性,隻需要使用

gmt gmtset xxx=yyy

即可,比如要設定坐标軸标簽字型為9号紅色

Helvetica字型

,就用這個指令

gmt gmtset FONT_ANNOT=9p,Helvetica,red

主題設定

如果是要應用一個主題,比如程式設計代碼中常用的很受歡迎的顔色主題

Monokai

,在GMT繪圖中也可以設定類似這樣的主題,然後在繪圖代碼中加入應用這個主題,非常容易切換。

簡單的dark主題代碼:

function MonokaiTheme()
{
    gmt set PS_PAGE_COLOR=46/42/46
    gmt set FONT_ANNOT_PRIMARY=12p,Helvetica,white
    gmt set FONT=,,white
    gmt set MAP_DEFAULT_PEN=white
    gmt set MAP_FRAME_PEN=thicker,white
    gmt set MAP_TICK_PEN_PRIMARY=,white
    # --------color set -------------------
    color_G_eq_lat=orange               #緯度剖面地震分布點的填充顔色
}           

應用效果

在這個bash函數中設定了gmt參數以及自定義了一些顔色變量(根據情況自行定義),然後在你的繪圖代碼中調用這個函數

MonokaiTheme

即可生效。

主要繪圖代碼

# Test 3D View of GMT: simple example
# Zhikui Guo, 2018-12-09, GEOMAR, Germany

# 0. include some code setting segments, e.g., theme, data, range, ...
. include.sh
# 0.1 figset
figset
# 0.2 data set
dataset
# 1. apply theme
MonokaiTheme

# plot 
gmt begin $figname pdf,png
    gmt basemap -JX$width_fig_x/$width_fig_y -JZ$width_fig_z -R$xmin/$xmax/$ymin/$ymax/$zmin/$zmax -Ba -Bza+l"Z(m)" -BwsenZ+gred  -pz$angle_view/$zmin
    echo "$xc $yc zmin plane" | gmt pstext -JZ -p -F+f20p,Helvetica-Bold,blue=thinner,white+jCM+a190 -Dj0c/0c
    gmt basemap -JX$width_fig_x/$width_fig_y -JZ$width_fig_z -R$xmin/$xmax/$ymin/$ymax/$zmin/$zmax -Bwsenz+ggray  -pz$angle_view/$zmax
    echo "$xc $yc zmax plane" | gmt pstext -JZ -p -F+f20p,Helvetica-Bold,blue=thinner,white+jCM+a190 -Dj0c/0c
    gmt basemap -JX$width_fig_y/$width_fig_z -JZ$width_fig_x -R$ymin/$ymax/$zmin/$zmax/$xmin/$xmax -Ba -BwSenz+glightblue@$alpha_profile -Bx+l"Y(m)" --MAP_FRAME_PEN=1,black@0 --MAP_ANNOT_OFFSET=-0.2   -px$angle_view/$xminn
    echo "$yc $zc ymin plane" | gmt pstext -JZ -p -F+f20p,Helvetica-Bold,blue=thinner,white+jCM+a45 -Dj0c/0c
    gmt basemap -JX$width_fig_x/$width_fig_z -JZ$width_fig_y -R$xmin/$xmax/$zmin/$zmax/$ymin/$ymax -Ba -BwSenz+glightgreen@$alpha_profile -Bx+l"X(m)" --MAP_FRAME_PEN=1,black@0 --MAP_ANNOT_OFFSET=-0.2  -py$angle_view/$ymax
    echo "$xc $zc xminn plane" | gmt pstext -JZ -p -F+f20p,Helvetica-Bold,blue=thinner,white+jCM+a-45 -Dj0c/0c
gmt end
open $figname.pdf
rm tmp* gmt.conf gmt.history            

上面的

MonokaiTheme

函數就是寫在

include.sh

檔案中,存放在了目前目錄下。

通用主題

上面這個例子的主題函數頭檔案儲存在了目前目錄,那麼如果在其他地方繪圖,則無法調用這個主題檔案,除非在開頭加入

. xxx/xxx/include.sh

前面需要

include.sh

的檔案路徑。這樣操作就很不優雅了,解決方案是:将你預定義的主題配置檔案存放在一個固定目錄下,然後在

PATH

環境變量中添加這個路徑,就可以直接調用這個主題檔案而不需要加入長長的檔案路徑。

舉例

  1. 在計算機的更目錄下建立了一個

    /MyData/GMTDATA

    目錄專門存放GMT相關的檔案。
  2. 在此目錄下建立一個

    include

    目錄
  3. include

    裡面建立一個叫

    styles.sh

    的檔案
  4. styles.sh

    檔案中加入上面的

    MonokaiTheme

    函數代碼段。
  5. /MyData/GMTDATA/include

    目錄加入PATH環境變量:在

    ~/.bash_profile

    檔案末尾添加這樣一句:
#将GMT常用代碼段檔案目錄加入系統環境變量
export PATH="/MyData/GMTDATA/include:$PATH"
           

然後用

source ~/.bash_profile

指令或者重新開機終端即可生效。然後在你的GMT繪圖代碼中加入如下代碼即可應用相應的主題:

# 1. apply theme
. styles.sh
MonokaiTheme           

上面設定PATH的目錄是讓bash能搜尋到

styles.sh

檔案并在你的GMT繪圖代碼(其實就是bash腳本)中用

. styles.sh

的形式包含檔案,進而可以用

MonokaiTheme

函數實作主題應用。簡單兩句話就能夠應用主題有沒有很給力。

GMT使用者目錄

GMT提供了幾個目錄設定的

環境變量

:

$GMT_SHAREDIR, $GMT_DATADIR, $GMT_USERDIR, $GMT_TMPDIR

,每個環境變量的表示的意義見

官網解釋

。這裡要講的是指定

GMT_USERDIR

環境變量。

GMT_USERDIR

當你指定了GMT_USERDIR目錄之後,GMT讀取檔案的時候就可以在此目錄下搜尋,而不需要在檔案前面加路徑。

舉例:自定義logo和時間戳

比如在~/.bash_profile中添加這樣一句指令

export GMT_USERDIR=/MyData/GMTDATA

就指定了

GMT_USERDIR

,進而可以友善的使用一些自己的檔案,比如你的logo圖檔檔案(e.g., moderngmt.png 存放在

$GMT_USERDIR/logo

目錄下),然後就可以在GMT圖中加入你的logo在一定程度上可以作為一種原創标記。

在上面的繪圖代碼中加入這樣兩句:

gmt begin $figname pdf,png
    # ......省略
    # ......省略
    # add time stamp
    date +%Y-%m-%d | awk '{print 0, 0.5, $1}' | gmt pstext -Jx1/1 -R0/10/0/10 -F+f11p,Helvetica+jLT+a0
    # add logo
    gmt image logo/modernfig.png -Dx0/0.5+w2c
gmt end           

即可實作在左下角加入自己的logo和時間戳

雖然Seisman在部落格中提到了自定義logo的方法,但是那種方法稍微的不靈活。上面這兩句指令加入logo和時間戳更友善一些,友善更換logo圖檔。

更優雅的解決logo

上面的方法雖然隻有兩行代碼,但是要在每個繪圖代碼中都添加,還是挺麻煩的。相信聰明機智的你肯定想到辦法了,沒錯 就是這樣:代碼重用,加入到include目錄。

  1. 在/MyData/GMTDATA/include目錄下建立

    stdafx.sh

    檔案(命名來源于visual studio 的c++風格,存放一些常用的繪圖代碼片段,比如添加logo的代碼片段)
  2. 添加logo函數
function add_logo()
{
    # add time stamp
    date +%Y-%m-%d | awk '{print 0, 0.5, $1}' | gmt pstext -Jx1/1 -R0/10/0/10 -F+f11p,Helvetica+jLT+a0
    # add logo
    gmt image logo/modernfig.png -Dx0/0.5+w2c
}           
  1. 包含 & 使用
  • 包含頭檔案:與styles.sh類似,在GMT繪圖代碼中用指令

    . stdafx.sh

  • 使用:在需要添加logo和時間戳的地方(建議在繪圖代碼末尾)使用指令

    add_logo

    即可

資料路徑

GMT提供的GMT_DATADIR環境變量為資料通路提供了極大友善,把一些常用的資料放在指定目錄然後将這些路徑加入到GMT_DATADIR環境變量中即可直接在GMT繪圖代碼中通路相應的資料。

  1. 建立相應的資料路徑并存儲資料:比如建立一個存放全球地形目錄

    /MyData/DATA/GlobalGeophysicalData/ETOPO1

    和全球衛星重力資料路徑

    /MyData/DATA/GlobalGeophysicalData/grav

  1. 添加環境變量:在

    ~/.bash_profile

    末尾添加如下代碼
export GMT_DATADIR="/MyData/DATA/GlobalGeophysicalData/etopo:/MyData/DATA/GlobalGeophysicalData/grav"           
  1. 使用:從全球地形和重力異常資料中截取西南印度洋區域,并成圖。代碼如下
figname=bathy_swir
fmt=pdf
gmt begin bathy_swir $fmt,png
    figwidth=10
    lat_max=-10
    range=0/70/-50/$lat_max
    # 1. 在ETOPO1中以10分的間隔重采樣,西南印度洋區域
    gmt grdsample ETOPO1.nc -R$range -I10m -Getopo.nc
    gmt grd2cpt etopo.nc -Cetopo1 -Z >etopo.cpt
    gmt grdimage etopo.nc -Cetopo.cpt -R$range -JM$figwidth -Ba -BWSen
    gmt colorbar -Cetopo.cpt -Dg0/$lat_max+w$figwidth+h+jBL+m+o0/0.3c -Bxa2000f400 -By+l"m"
    # 2. 在grav.23.nc中截取同樣的範圍(http://science.sciencemag.org/content/346/6205/65)
    gmt grdsample grav.23.nc -R$range -I10m -Ggrav.nc
    move_x=`echo $figwidth | awk '{print $1*1.1}'`
    gmt grd2cpt grav.nc -Crainbow -Z >grav.cpt 
    gmt grdimage grav.nc -Cgrav.cpt -R$range -JM$figwidth -Ba -BwSEn -X$move_x
    gmt colorbar -Cgrav.cpt -Dg0/$lat_max+w$figwidth+h+jBL+m+o0/0.3c -Bxa100f20 -By+l"mGal"
gmt end
open $figname.$fmt           

繪圖效果

很簡單的幾句代碼就可以實作此繪圖效果,如此簡潔如此高效!

暗黑風格

Tips 對于有些資料檔案名比較場的情況,比如

ETOPO1_Bed_g_gdal.nc

,如果不想改此檔案名(建議不要改)而想使用一個更為簡潔的名字(比如

ETOPO1.nc

)通路此檔案。可以使用連結形式,使用代碼
ln -s /MyData/DATA/GlobalGeophysicalData/etopo/ETOPO1_Bed_g_gdal.nc /MyData/DATA/GlobalGeophysicalData/etopo/ETOPO1.nc           

即可做到,其實就是類似windows安裝軟體的時候出現的桌面軟連結一個道理。