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

作者: 九天学者 | 来源:发表于2018-12-12 21:19 被阅读48次

    GMT无疑是一个非常方便且高效的通用绘图软件,尤其是最近更新了modern模式,使得科研绘图更简单更高效!GMT默认的绘图风格(通常会用在ppt里)整体上是白底黑字,这更大多数的软件都是一样的。但是如果你是个暗黑风格爱好者,一个白底黑字的图片放在暗黑风格的ppt里面是不是有点煞风景,下面分享几则技巧来解决这个问题,让你的暗黑ppt更和谐:自定义主题,一键切换!还有就是一些常用的数据以及一些常用的代码段,只需要将这些数据和代码段归档在一个指定目录并把这个目录加入环境变量就可以直接使用,而不需在GMT绘图代码中加入冗长的路径名称。

    Mac & GMT6

    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三维绘图+暗黑主题

    主要绘图代码

    # 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三维绘图+暗黑主题+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

    2. 添加环境变量:在~/.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
    

    绘图效果

    SWIR.etopo1.grav.23

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

    暗黑风格

    SWIR.etopo1.grav.23+MonokaiTheme

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/uaiphqtx.html