3.4 绘制第一张图

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

重要

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

3.4.1 图件分析与拆解

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

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

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

Source Code

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

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

3.4.2 绘制底图

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

gmt begin first-plot pdf,png
gmt coast -JH110/24c -Rg -Bg30 -Glightgreen -Slightblue -A1000 -Dc
gmt end
../../_images/first-plot-gmtplot-1.png

GMT绘图脚本总是以 gmt begin 开始制图,并以 gmt end 结束制图。其中 first-plot 为生成的图件名,pdf,png 表示最终生成的图片格式为 PDF和PNG格式。

解释一下 coast 模块中的一些选项:

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

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

3.4.3 绘制震中和台站位置

plot 模块可以用于绘制多种不同类型的符号,比如五角星和三角形。绘图脚本如下:

#!/bin/bash
gmt begin first-plot pdf,png
gmt coast -JH110/24c -Rg -Bg30 -Glightgreen -Slightblue -A1000 -Dc

# 绘制震中位置
gmt plot -Sa0.5c -W0.5p,black,solid -Gyellow << EOF
130.72 32.78
EOF

# 绘制台站位置
gmt plot -St0.2c -W0.5p,black,solid -Gblack << 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 end
../../_images/first-plot-gmtplot-2.png

这里我们通过两次调用 plot 命令分别绘制了五角星和三角形。

解释一下:

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

3.4.4 绘制射线路径

plot 模块还可以用于绘制线段,默认情况下,plot 会自动用大圆路径连接地球上的两个位置,不需要额外设置。首先直接看代码:

#!/bin/bash
gmt begin first-plot pdf,png
gmt coast -JH110/24c -Rg -Bg30 -Glightgreen -Slightblue -A1000 -Dc

# 绘制震中位置
gmt plot -Sa0.5c -W0.5p,black,solid -Gyellow << EOF
130.72 32.78
EOF

# 绘制台站位置
gmt plot -St0.2c -W0.5p,black,solid -Gblack << 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 plot -W1p,red << 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 end
../../_images/first-plot-gmtplot-3.png

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

3.4.5 添加台站名

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

#!/bin/bash
gmt begin fist-plot pdf,png
gmt coast -JH110/24c -Rg -Bg30 -Glightgreen -Slightblue -A1000 -Dc

# 绘制震中位置
gmt plot -Sa0.5c -W0.5p,black,solid -Gyellow << EOF
130.72 32.78
EOF

# 绘制台站位置
gmt plot -St0.2c -W0.5p,black,solid -Gblack << 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 plot -W1p,red << 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 text -F+f12p,1,black+jTL -D-1.5c/-0.15c << EOF
-77.15 38.89 Washington
76.22 -69.22 Zhongshanzhan
EOF
gmt text -F+f12p,1,black+jTL -D-1c/-0.15c << EOF
104.39 29.90 Zigong
13.14 52.50 Berlin
19.99 -34.52 Bredasdorp
EOF
gmt text -F+f12p,1,black+jTL -D-0.6c/-0.15c << EOF
150.36 -33.79 Sydney
EOF
gmt text -F+f12p,1,black+jTL -D-0.6c/-0.15c << EOF
-52.47 -31.62 Pelotas
EOF

gmt end
../../_images/first-plot-gmtplot-4.png

解释如下:

  1. EOF 之间的每一行依次是加入的文本的纬度、经度和内容,这与 plot 类似,只是因为有内容,所以多了一列。之所以没有写在一个 gmt text 命令之下,是因为不同位置的文本的具体位置需要些许不同的调整,你可以看到每个 text 命令的 -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.4.6 图层的先后顺序

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

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

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

#!/bin/bash
gmt begin fist-plot pdf,png
gmt coast -JH110/24c -Rg -Bg30 -Glightgreen -Slightblue -A1000 -Dc

# 绘制大圆路径
gmt plot -W1p,red << 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 plot -Sa0.5c -W0.5p,black,solid -Gyellow << EOF
130.72 32.78
EOF

# 绘制台站位置
gmt plot -St0.2c -W0.5p,black,solid -Gblack << 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 text -F+f12p,1,black+jTL -D-1.5c/-0.15c << EOF
-77.15 38.89 Washington
76.22 -69.22 Zhongshanzhan
EOF
gmt text -F+f12p,1,black+jTL -D-1c/-0.15c << EOF
104.39 29.90 Zigong
13.14 52.50 Berlin
19.99 -34.52 Bredasdorp
EOF
gmt text -F+f12p,1,black+jTL -D-0.6c/-0.15c << EOF
150.36 -33.79 Sydney
EOF
gmt text -F+f12p,1,black+jTL -D-0.6c/-0.15c << EOF
-52.47 -31.62 Pelotas
EOF

gmt end
../../_images/first-plot-gmtplot-5.png

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