<div>
<p></p>
<div style="text-align:center;">
<img alt="1c220333c66c71bed227b8b008365c9e.png" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-3a7c2d150822f45a2412e71e71085f45.png">
</div>
<p>Generic Mapping Tools(GMT)是科研工作者常用的画图工具。GMT的功能强大,也内置了一些统计模块。相较于其他常用的绘图工具(或含有绘图功能的软件,比如Matlab,Python,R等),GMT的特点是高效出图,缺点则是没有可操作的直观界面(GUI)。 </p>
<p>我这系列的文章奔着“开袋即食”的理念,直接从实例入手。部分GMT4,5和6的区别,我也会提到。提前说明,文章中,我只会针对实例给出代码,至于如何举一反三,请各位同学自行根据GMT手册研究。</p>
<p>序言:GMT的使用环境</p>
<p>(1)安装</p>
<p>我个人是使用mac作为工作电脑环境,因此安装GMT可以用homebrew、macport等工具简单地进行安装。在终端里输入:</p>
<div class="blockcode">
<pre class="blockcode"><code>brew install gmt </code></pre>
</div>
<p>或</p>
<div class="blockcode">
<pre class="blockcode"><code>brew install gmt@5 </code></pre>
</div>
<p>注意homebrew里的GMT包是GMT6的版本。如果要安装GMT5版本,需使用第二条命令。</p>
<p>(2)使用</p>
<p>通常,GMT的代码都需要写在bash之类的批处理用文档里。</p>
<p>比如,本次实例所用代码都可以写入plscatter.sh这样的文件里,然后通过以下命令执行。</p>
<div class="blockcode">
<pre class="blockcode"><code>sh plscatter.sh</code></pre>
</div>
<p>正文:(1)散点图(Scatter Plot)+拟合 —— 此为GMT5版</p>
<p>先上效果图(数据是我随手选的)。</p>
<p></p>
<div style="text-align:center;">
<img alt="be6472cb62790387a9d9305889792507.png" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-0676f5c0bd3cd363bd80be03470ed699.png">
</div>
<figcaption>
图1 含有两个子图和拟合直线的散点图
</figcaption>
<p>这张图上,包含了大部分GMT画散点图所需要用到内容:</p>
<ol><li>绘制子图</li><li>根据数据绘制点并着色。</li><li>绘制颜色尺度</li><li>添加不同字体、颜色的文本和绘制文本框</li><li>上下标等小功能</li></ol>
<p>伸手党可以直接复制走。如果想学习,则可以继续往后看。</p>
<div class="blockcode">
<pre class="blockcode"><code>#!/bin/bash
# Description: A sample for GMT.
# Author: Zhihu Gadian
#
# output in English
export LANG=C
######### Personal Settings
# . ./gmtpar.sh 调用公共设置中,以下为gmtpar.sh的内容。
gmt set PROJ_LENGTH_UNIT INCH
gmt set FONT_TITLE 20
gmt set FONT_ANNOT_PRIMARY 14
gmt set FONT_LABEL 16
gmt set MAP_TICK_PEN thin
gmt set MAP_FRAME_TYPE plain
gmt set MAP_FRAME_PEN thicker
gmt set PS_MEDIA a4
########## End Personal Settings
range=1800/2400/1800/2400
cptfile=compare.cpt
size=2.8
xanot=a200f100g300
yanot=a200f100g300
in=sample.txt
out=sample.ps
gmt makecpt -Cseis -T0/60/2 -D -I > $cptfile
########panel 1
gmt psbasemap -R${<!-- -->range} -JX${<!-- -->size} -B${<!-- -->xanot}:"Sample 1 Obs. [m@+2@+]":/${<!-- -->yanot}:"Sample 1 Model [m@+2@+]":WSne -X1 -K > $out
awk '{if ( $1 != "#" && $2 > -900. && $4 > -900. ) print $2,$4,$1}' $in|
gmt psxy -R -J -Sc0.04 -C$cptfile -O -K >> $out
awk '{if ( $1 != "#" && $2 > -900. && $4 > -900. ) print $2,$4}' $in|
gmt regress -Fxm -T1700/2500/1 > sample1_regressed.txt
awk '{if ( $1 != "#" && $1 > -900. && $2 > -900. ) print $1,$2}' sample1_regressed.txt |
gmt psxy -R -J -W0.5 -O -K >> $out
gmt pstext -R -J -N -F+a0+f14p,Helvetica-Bold+jLT -O -K >> $out << EOF
1850 2350 a)
EOF
gmt pstext -R -J -N -F+a0+f12p,Times-Italic+jLT -Gwhite -Wthinner -O -K >> $out << EOF
2000 1900 @;blue;y = 0.791 x + 481.469@;;
EOF
########panel 2
gmt psbasemap -R${<!-- -->range} -JX${<!-- -->size} -B${<!-- -->xanot}:"@~D@~Sample 2@-Obs.@- [m@+-2@+]":/${<!-- -->yanot}:"@~D@~Sample 2@-model@- [m@+-2@+]":WSne -X4 -O -K >> $out
awk '{if ( $1 != "#" && $3 > -900. && $5 > -900.) print $3,$5,$1}' $in|
gmt psxy -R -J -Sc0.04 -C$cptfile -O -K >> $out
awk '{if ( $1 != "#" && $3 > -900. && $5 > -900. ) print $3,$5}' $in|
gmt regress -Fxm -T1700/2500/1 > sample2_regressed.txt
awk '{if ( $1 != "#" && $1 > -900. && $2 > -900. ) print $1,$2}' sample2_regressed.txt |
gmt psxy -R -J -W0.5 -O -K >> $out
gmt pstext -R -J -N -F+a0+f14p,Helvetica-Bold+jLT -O -K >> $out << EOF
1850 2350 b)
EOF
gmt pstext -R -J -N -F+a0+f12p,Times-Italic+jLT -Gwhite -Wthinner -O -K >> $out <& |
|