4.2 入门示例2

这一节将通过绘制一张射线路径分布图来介绍GMT的模块化作图思想,同时简单介绍 psxypstext 模块的功能。

4.2.1 GMT模块化制图

在实际作图时,一副完整的图画是由很多部分组成的。GMT在制图时遵循模块化思想,每个模块只绘制整张图的一部分,因而通常一张图需要使用多个GMT命令才能绘制完成。绘制的过程中,若想修改图中的某个部分,只需修改绘制该部分所使用的命令即可,而不会影响其他部分。这就是模块化作图。

GMT将绘制的图保存在PostScrip文件中。一个完整的PostScript文件由一个文件头、多个文件内容和一个文件尾组成。默认情况下,每一条GMT命令都会生成一个完整的PostScript文件的三个部分。因而,若不经特殊处理,多个GMT命令生成的PostScript文件会因为包含了多个文件头和文件尾而出错。那么在使用多个GMT命令绘图时,如何保证第一条GMT命令不生成文件尾,中间的GMT命令不生成文件头和文件尾,最后一条GMT命令不生成文件头呢?办法是用 -K-O 选项。当命令包含 -K 时,不会生成文件尾。当命令包含 -O 时,不会生成文件头。

下图是我们想要绘制的图的最终效果。首先要将这个稍复杂的图分解成若干个部分:底图(海岸线)、震中位置(五角星)、台站位置(三角形)、射线路径(大圆弧线段)以及台站名。

../../_images/GMT_tutor2_5.png

下面会一步步地把整张图绘制出来。

4.2.2 绘制底图

上一节已经介绍了如何画全球地图,所以我们很容易就用 pscoast 模块把底图绘制出来。

gmt pscoast -JH110/24c -Rg -Bg30 -Glightgreen -Slightblue -A1000 -Dc > GMT_tutor2_1.ps

解释一下:

  1. -JH110/24c 表示使用Hammer投影,投影中心为110度,整张图宽度为 24c
  2. -Rg 相当于 -R0/360/-90/90 即绘制全球范围
  3. -Glightgreen 表示将陆地填充浅绿色, -Slightblue 表示将海洋填充浅蓝色

效果如图

../../_images/GMT_tutor2_1.png

4.2.3 绘制震中和台站位置

一般用五角星表示震中,三角形表示台站。五角星和三角形这样的图案用 psxy 模块绘制,见下面的代码和结果:

#!/bin/bash
J=H110/24c
R=g
PS=GMT_tutor2_2.ps

gmt pscoast -J$J -R$R -Bg30 -Glightgreen -Slightblue -A1000 -Dc -K > $PS

# 绘制震中位置
gmt psxy -J -R -Sa0.5c -W0.5p,black,solid -Gyellow -K -O >> $PS << EOF
130.72 32.78
EOF

# 绘制台站位置
gmt psxy -J -R -St0.2c -W0.5p,black,solid -Gblack -K -O >> $PS << EOF
104.39 29.90
13.14 52.50
19.99 -34.52
-77.15 38.89
-52.47 -31.62
150.36 -33.79
76.22 -69.22
EOF

gmt psxy -J -R -T -O >> $PS
rm gmt.*
../../_images/GMT_tutor2_2.png

解释一下:

  1. 除了上一步的 pscoast 命令绘制底图之外,又加了几个 psxy 命令。因为行数变多,所以我们通常会定义使用脚本,并定义变量(比如 $PS )以简化输入
  2. 第一个 psxy 命令用于绘制震中位置,第二个则用于绘制台站位置
  3. -S 表示要绘制符号。 -Sa/0.5c 表示绘制大小为 0.5厘米的五角星, -St0.2c 表示绘制大小为0.2厘米的三角形
  4. -W 表示画笔的属性,这里用于指定用什么样的画笔绘制三角形或五角星的轮廓。 -W0.5p,black,solid 的意思是画笔 0.5p 宽,黑色,实心。
  5. -G 表示颜色填充,后面跟颜色的名字;-Gblack 表示填充黑色;-Gyellow 表示填充黄色。
  6. 确定了画什么样的符号,还要确定在哪里画。两个 EOF 之间的是命令的输入数据,在这里就是位置信息,一行代表一个位置。默认情况下,GMT认为第一个数是经度,第二个是纬度。
  7. 最后一个 psxy 命令没有绘制任何东西,其作用仅仅在于向PostScript文件加入了文件尾,你可以认为这句话的作用是关闭GMT绘图

注意到了吗?相对于上一步的命令而言, pscoast 命令中多了一个 -K 选项, 中间的几个 psxy 命令使用了 -K -O 选项,最后一个命令则使用了 -O 选项。

4.2.4 绘制射线路径

psxy 模块除了绘制符号,也绘制线条。下面我们用 psxy 给图画加上射线路径。 psxy 会自动用大圆路径连接地球上的两个位置,不需要额外设置。首先直接看代码:

#!/bin/bash
J=H110/24c
R=g
PS=GMT_tutor2_3.ps

gmt pscoast -J$J -R$R -Bg30 -Glightgreen -Slightblue -A1000 -Dc -K > $PS

# 绘制震中位置
gmt psxy -J -R -Sa0.5c -W0.5p,black,solid -Gyellow -K -O >> $PS << EOF
130.72 32.78
EOF

# 绘制台站位置
gmt psxy -J -R -St0.2c -W0.5p,black,solid -Gblack -K -O >> $PS << EOF
104.39 29.90
13.14 52.50
19.99 -34.52
-77.15 38.89
-52.47 -31.62
150.36 -33.79
76.22 -69.22
EOF

# 绘制大圆路径
gmt psxy -R -J -W1p,red -K -O >> $PS << EOF
>
130.72 32.78
104.39 29.90
>
130.72 32.78
13.14 52.50
>
130.72 32.78
19.99 -34.52
>
130.72 32.78
-77.15 38.89
>
130.72 32.78
-52.47 -31.62
>
130.72 32.78
150.36 -33.79
>
130.72 32.78
76.22 -69.22
EOF

gmt psxy -J -R -T -O >> $PS
rm gmt.*

用于绘制射线路径的 psxy 命令和之前的命令的区别在于没有了 -S-G 选项。为了绘制一条线段,至少需要指定两个端点,输入数据中每个 > 之后的两行数据分别代表一条线条的两个端点位置。结果如下:

../../_images/GMT_tutor2_3.png

4.2.5 添加台站名

最后还需要往图画里添加台站所在地区的名字。添加文字使用 pstext 模块:

#!/bin/bash
J=H110/24c
R=g
PS=GMT_tutor2_4.ps

gmt pscoast -J$J -R$R -Bg30 -Glightgreen -Slightblue -A1000 -Dc -K > $PS

# 绘制震中位置
gmt psxy -J -R -Sa0.5c -W0.5p,black,solid -Gyellow -K -O >> $PS << EOF
130.72 32.78
EOF

# 绘制台站位置
gmt psxy -J -R -St0.2c -W0.5p,black,solid -Gblack -K -O >> $PS << EOF
104.39 29.90
13.14 52.50
19.99 -34.52
-77.15 38.89
-52.47 -31.62
150.36 -33.79
76.22 -69.22
EOF

# 绘制大圆路径
gmt psxy -R -J -W1p,red -K -O >> $PS << EOF
>
130.72 32.78
104.39 29.90
>
130.72 32.78
13.14 52.50
>
130.72 32.78
19.99 -34.52
>
130.72 32.78
-77.15 38.89
>
130.72 32.78
-52.47 -31.62
>
130.72 32.78
150.36 -33.79
>
130.72 32.78
76.22 -69.22
EOF

# 添加文本
gmt pstext -J -R -F+f12p,1,black+jTL -D-1.5c/-0.15c -K -O >> $PS << EOF
-77.15 38.89 Washington
76.22 -69.22 Zhongshanzhan
EOF
gmt pstext -J -R -F+f12p,1,black+jTL -D-1c/-0.15c -K -O >> $PS << EOF
104.39 29.90 Zigong
13.14 52.50 Berlin
19.99 -34.52 Bredasdorp
EOF
gmt pstext -J -R -F+f12p,1,black+jTL -D-0.6c/-0.15c -K -O >> $PS << EOF
150.36 -33.79 Sydney
EOF
gmt pstext -J -R -F+f12p,1,black+jTL -D-0.6c/-0.15c -K -O >> $PS << EOF
-52.47 -31.62 Pelotas
EOF

gmt psxy -J -R -T -O >> $PS
rm gmt.*
../../_images/GMT_tutor2_4.png

解释如下:

  1. EOF 之间的每一行依次是加入的文本的纬度、经度和内容,这与 psxy 类似,只是因为有内容,所以多了一列。之所以没有写在一个 gmt pstext 命令之下,是因为不同位置的文本的具体位置需要些许不同的调整,你可以看到每个 pstext 命令的 -D 参数些许不同,下面会详细解释。
  2. -F 控制文本的字体、对齐方式等属性; +f10p,1,black 表示使用大小为 10p 的黑色1号字体; +j 是控制文本的对齐方式, TL 表示输入数据中的经纬度坐标是文本块的左上角, L 指左, T 指上, LTTL 的含义完全一样。
  3. -D 是在上述坐标的基础上微调。 -D-1.5c/-0.15c 是说向左移动1.5厘米,向下移动0.15厘米。

4.2.6 图层的概念

一条GMT绘图命令产生一段postscript语句在postscript文件里。我们用evince、Acrobat这类postscript文件解释器打开postscript文件时,解释器会依次读取,然后依次显示。后面读取的代码的图层会在前面的代码的图层的上面,简单的说就是后来者居上。看我们刚刚画的图,因为震中的黄色五角星先画所以被地震射线盖住了(其实,地名的三角形也是,只是因为射线没有那么多所以不明显)。我们可以调换代码的顺序,就可以把射线的图层放到最下面:

#!/bin/bash
J=H110/24c
R=g
PS=GMT_tutor2_5.ps

gmt pscoast -J$J -R$R -Bg30 -Glightgreen -Slightblue -A1000 -Dc -K > $PS

# 绘制大圆路径
gmt psxy -R -J -W1p,red -K -O >> $PS << EOF
>
130.72 32.78
104.39 29.90
>
130.72 32.78
13.14 52.50
>
130.72 32.78
19.99 -34.52
>
130.72 32.78
-77.15 38.89
>
130.72 32.78
-52.47 -31.62
>
130.72 32.78
150.36 -33.79
>
130.72 32.78
76.22 -69.22
EOF

# 绘制震中位置
gmt psxy -J -R -Sa0.5c -W0.5p,black,solid -Gyellow -K -O >> $PS << EOF
130.72 32.78
EOF

# 绘制台站位置
gmt psxy -J -R -St0.2c -W0.5p,black,solid -Gblack -K -O >> $PS << EOF
104.39 29.90
13.14 52.50
19.99 -34.52
-77.15 38.89
-52.47 -31.62
150.36 -33.79
76.22 -69.22
EOF

# 添加文本
gmt pstext -J -R -F+f12p,1,black+jTL -D-1.5c/-0.15c -K -O >> $PS << EOF
-77.15 38.89 Washington
76.22 -69.22 Zhongshanzhan
EOF
gmt pstext -J -R -F+f12p,1,black+jTL -D-1c/-0.15c -K -O >> $PS << EOF
104.39 29.90 Zigong
13.14 52.50 Berlin
19.99 -34.52 Bredasdorp
EOF
gmt pstext -J -R -F+f12p,1,black+jTL -D-0.6c/-0.15c -K -O >> $PS << EOF
150.36 -33.79 Sydney
EOF
gmt pstext -J -R -F+f12p,1,black+jTL -D-0.6c/-0.15c -K -O >> $PS << EOF
-52.47 -31.62 Pelotas
EOF

gmt psxy -J -R -T -O >> $PS
rm gmt.*
../../_images/GMT_tutor2_5.png

需要注意的是,本节内容仅作演示用,实际绘图时通常会写脚本来处理自己的数据,以使得其符合GMT输入数据的要求,而不是像本节示例中这样手写所有的数据。