3.3 绘制第一张图

这一节将通过绘制一张地震学常见的射线路径分布图,来展示GMT模块化作图的思想以及 GMT中图层的概念。

重要

请注意,以下均采用Linux下的bash脚本作为示例,如果你是在 Windows下使用bat脚本,并且对bash和bat脚本的区别不太了解,强烈建议先阅读 命令行及脚本基础 一节。

3.3.1 图件分析与拆解

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

下图展示了我们最终想要实现的绘图效果。整张图由如下几个部分构成:

  1. 底图(海岸线)
  2. 震中位置(五角星)
  3. 台站位置(三角形)、射线路径(大圆弧线段)
  4. 台站名(文本)

Source Code

../../_images/first-plot-gmtplot-0.png

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

3.3.2 绘制底图

GMT中的 pscoast 模块,可以绘制带海岸线的底图,并可以给陆地和海洋分别填充不同的颜色,绘图命令及效果如下:

gmt pscoast -JH110/24c -Rg -Bg30 -Glightgreen -Slightblue -A1000 -Dc > first-plot.ps
../../_images/first-plot-gmtplot-1.png

解释一下几个选项:

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

至此,即得到了我们需要的底图。

3.3.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/first-plot-gmtplot-2.png

这里我们通过两次调用 psxy 命令分别绘制了五角星和三角形。由于绘图的命令比较多,所以我们将绘图命令写成了一个脚本,并定义了一些变量(比如 $PS)以避免重复输入类似的文本。

解释一下:

  1. 第一个 psxy 命令用于绘制震中位置,第二个则用于绘制台站位置
  2. -Sa0.5c 表示绘制大小为 0.5厘米的五角星, -St0.2c 表示绘制大小为0.2厘米的三角形
  3. -W 表示画笔的属性,这里用于指定用什么样的画笔绘制三角形或五角星的轮廓。 -W0.5p,black,solid 的意思是画笔 0.5p 宽,黑色,实心。
  4. -G 表示颜色填充,后面跟颜色的名字;-Gblack 表示填充黑色; -Gyellow 表示填充黄色。
  5. 确定了画什么样的符号,还要确定在哪里画。两个 EOF 之间的是命令的输入数据,在这里就是位置信息,一行代表一个位置。默认情况下,GMT认为第一个数是经度,第二个是纬度。
  6. 最后一个 psxy 命令没有绘制任何东西,其作用在于结束绘图,这属于稍高级的技巧,以后会介绍到。

注意到了吗?相对于上一步的命令而言,pscoast 命令中多了一个 -K 选项,中间的几个 psxy 命令使用了 -K -O 选项,最后一个命令则使用了 -O 选项。具体原因此处不解释,在 -K 和 -O 选项 一节会详细介绍。

3.3.4 绘制射线路径

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.*
../../_images/first-plot-gmtplot-3.png

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

3.3.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/first-plot-gmtplot-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厘米。

3.3.6 图层的先后顺序

上面的绘图脚本已经基本绘制出我们最初想要的图件了。细细看会发现,还有一些不完美的地方:比如黄色五角星和三角形被线段盖住了。

这是因为,GMT的每一个绘图命令都会产生一个图层,后绘制的图层会覆盖在先绘制的图层的上面,即后来者居上。解决办法也很简单,先绘制线段,再绘制三角形和五角星即可。

对脚本中命令的先后顺序进行微调,如下所示:

#!/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/first-plot-gmtplot-5.png

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