Mac & GMT6GMT无疑是一个非常方便且高效的通用绘图软件,尤其是最近更新了modern模式,使得科研绘图更简单更高效!GMT默认的绘图风格(通常会用在ppt里)整体上是白底黑字,这更大多数的软件都是一样的。但是如果你是个暗黑风格爱好者,一个白底黑字的图片放在暗黑风格的ppt里面是不是有点煞风景,下面分享几则技巧来解决这个问题,让你的暗黑ppt更和谐:自定义主题,一键切换!还有就是一些常用的数据以及一些常用的代码段,只需要将这些数据和代码段归档在一个指定目录并把这个目录加入环境变量就可以直接使用,而不需在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
环境变量中添加这个路径,就可以直接调用这个主题文件而不需要加入长长的文件路径。
举例
-
在计算机的更目录下创建了一个
/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和时间戳
GMT三维绘图+暗黑主题+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
绘图效果
SWIR.etopo1.grav.23很简单的几句代码就可以实现此绘图效果,如此简洁如此高效!
暗黑风格
SWIR.etopo1.grav.23+MonokaiThemeTips 对于有些数据文件名比较场的情况,比如
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安装软件的时候出现的桌面软链接一个道理。
网友评论