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
环境变量中添加这个路径,就可以直接调用这个主题文件而不需要加入长长的文件路径。
举例
- 在计算机的更目录下创建了一个
/MyData/GMTDATA
目录专门存放GMT相关的文件。 - 在此目录下创建一个
include
目录 - 在
include
里面新建一个叫styles.sh
的文件 - 在
styles.sh
文件中加入上面的MonokaiTheme
函数代码段。 - 将
/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目录。
- 在/MyData/GMTDATA/include目录下新建
stdafx.sh
文件(命名来源于visual studio 的c++风格,存放一些常用的绘图代码片段,比如添加logo的代码片段) - 添加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
}
- 包含 & 使用
- 包含头文件:与styles.sh类似,在GMT绘图代码中用命令
. stdafx.sh
- 使用:在需要添加logo和时间戳的地方(建议在绘图代码末尾)使用命令
add_logo
即可
数据路径
GMT提供的GMT_DATADIR环境变量为数据访问提供了极大方便,把一些常用的数据放在指定目录然后将这些路径加入到GMT_DATADIR环境变量中即可直接在GMT绘图代码中访问相应的数据。
举例
- 创建相应的数据路径并存储数据:比如创建一个存放全球地形目录
/MyData/DATA/GlobalGeophysicalData/ETOPO1
和全球卫星重力数据路径/MyData/DATA/GlobalGeophysicalData/grav
- 添加环境变量:在
~/.bash_profile
末尾添加如下代码
export GMT_DATADIR="/MyData/DATA/GlobalGeophysicalData/etopo:/MyData/DATA/GlobalGeophysicalData/grav"
- 使用:从全球地形和重力异常数据中截取西南印度洋区域,并成图。代码如下
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安装软件的时候出现的桌面软链接一个道理。