如何优雅的使用GMT绘图(2): 主题风格和数据路径

如何优雅的使用GMT绘图(2): 主题风格和数据路径

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即可生效。

如何优雅的使用GMT绘图(2): 主题风格和数据路径

主要绘图代码

# 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和时间戳

如何优雅的使用GMT绘图(2): 主题风格和数据路径

虽然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

绘图效果

如何优雅的使用GMT绘图(2): 主题风格和数据路径

很简单的几句代码就可以实现此绘图效果,如此简洁如此高效!

暗黑风格

如何优雅的使用GMT绘图(2): 主题风格和数据路径

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安装软件的时候出现的桌面软链接一个道理。

上一篇:Latex文档中高亮显示代码


下一篇:sql datalength与len区别用法