|||
GMT无疑是一个非常方便且高效的通用绘图软件,尤其是最近更新了modern模式,使得科研绘图更简单更高效!GMT默认的绘图风格(通常会用在ppt里)整体上是白底黑字,这更大多数的软件都是一样的。但是如果你是个暗黑风格爱好者,一个白底黑字的图片放在暗黑风格的ppt里面是不是有点煞风景,下面分享几则技巧来解决这个问题,让你的暗黑ppt更和谐:自定义主题,一键切换!还有就是一些常用的数据以及一些常用的代码段,只需要将这些数据和代码段归档在一个指定目录并把这个目录加入环境变量就可以直接使用,而不需在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绘图中也可以设置类似这样的主题,然后在绘图代码中加入应用这个主题,非常容易切换。
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 figsetfigset# 0.2 data setdataset# 1. apply themeMonokaiTheme# 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/0cgmt endopen $figname.pdfrm 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.shMonokaiTheme
上面设置PATH的目录是让bash能搜索到styles.sh
文件并在你的GMT绘图代码(其实就是bash脚本)中用. styles.sh
的形式包含文件,从而可以用MonokaiTheme
函数实现主题应用。简单两句话就能够应用主题有没有很给力。
GMT提供了几个目录设置的环境变量: $GMT_SHAREDIR, $GMT_DATADIR, $GMT_USERDIR, $GMT_TMPDIR
,每个环境变量的表示的意义见官网解释。这里要讲的是指定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+w2cgmt end
即可实现在左下角加入自己的logo和时间戳
虽然Seisman在博客中提到了自定义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绘图代码中访问相应的数据。
举例 1. 创建相应的数据路径并存储数据:比如创建一个存放全球地形目录/MyData/DATA/GlobalGeophysicalData/ETOPO1
和全球卫星重力数据路径/MyData/DATA/GlobalGeophysicalData/grav
添加环境变量:在~/.bash_profile
末尾添加如下代码
export GMT_DATADIR="/MyData/DATA/GlobalGeophysicalData/etopo:/MyData/DATA/GlobalGeophysicalData/grav"
使用:从全球地形和重力异常数据中截取西南印度洋区域,并成图。代码如下
figname=bathy_swirfmt=pdfgmt 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 endopen $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安装软件的时候出现的桌面软链接一个道理。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-22 16:43
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社