GMT6入门教程(7)单行、图中图、子图和多图模式

1.单行模式

原文地址:GMT单行模式 — GMT中文手册

“单行模式”:当绘图只需要一个GMT命令时,可省略 gmt begin 和 gmt end,只需要在绘图命令后加上 -format figname 即可。

完整模式命令:

gmt begin GlobalMap png,pdf
    gmt coast -Rg -JH15c -Gpurple -Baf -B+t"My First Plot"
gmt end show

单行模式命令:

gmt coast -Rg -JH15c -Gpurple -Baf -B+t"My First Plot" -pdf,png GlobalMap

2.图中图模式

原文地址:GMT图中图模式 — GMT中文手册

模块:inset

用法:图中图模式以 inset begin 开始,并以 inset end 结束。

解释:使用 inset begin 进入图中图模式,其作用是在纸张上规划出一个矩形区域,并将绘图原点移动到该矩形区域的左下角。接下来的所有绘图命令均只在该区域内进行操作。当使用 inset end 结束图中图模式时,绘图原点会自动恢复到图中图模式之前的位置,且所有设置参数都将回到之前的状态。

2.1用矩形框标记研究区域

命令:

gmt begin inset-map png,pdf
    gmt coast -R139.2/140.5/34.8/36 -JM12c -Baf -BWSne -W2p -A1000 -Glightbrown -Sazure1 --FORMAT_GEO_MAP=dddF
    gmt inset begin -DjBL+w3c/3.6c+o0.1c -F+gwhite+p1p
        gmt coast -R129/146/30/46 -JM? -EJP+glightbrown+p0.2p -A10000
        # 使用 -Sr+s 绘制矩形区域
        echo 139.2 34.8 140.5 36 | gmt plot -Sr+s -W1p,blue
    gmt inset end
gmt end show

解释:

  • inset begin 定义了小图的位置位于大图左下角(-DjBL),小图区域的宽度为3厘米,高度为3.6厘米(+w3c/3.6c),并且相对大图左下角偏移0.1厘米(+o0.1c)。同时还设置了小图区域的背景色为白色(+gwhite),并绘制了小图区域的边框(+p1p)。
  • 在小图区域内,使用 coast 模块绘制了日本全图,小图投影参数为 -JM?,其中 ? 表示根据 inset begin 中 -D 选项指定的宽度自动决定小图宽度。
  • 使用 plot 模块的 -Sr+s 选项在小图中绘制了一个对应于大图区域的矩形框,该命令需要输入矩形区域的两个对角顶点的经纬度。

2.2用颜色标记研究区域

命令:

gmt begin inset-example png,pdf
    gmt coast -R110E/170E/44S/9S -JM6i -B -BWSne -Wfaint -N2/1p -Gbrown -EAU+gbisque
    gmt inset begin -DjTR+w1.5i+o0.15i/0.1i -F+gwhite+p1p+c0.1c
        gmt coast -JG120/30S/? -Rg -Bg -Wfaint -Gbrown -EAU+gbisque -A5000
    gmt inset end
gmt end show

解释:

  • inset begin 定义了小图的位置位于大图右上角(-DjTR),小图区域宽度为 1.5英寸(+w1.5i)
  • 在小图内部在需要指定地图宽度的地方使用了 ? 让GMT自动帮我们决定小图的宽度。

3.子图模式

原文地址:GMT子图模式 — GMT中文手册

两种方式可以绘制多子图:

  • 常规方式:在绘图时使用 -X 和 -Y 选项 手动移动每个子图的原点
  • 现代方式:使用 subplot 模块提供的子图模式来布局和管理多子图

现代方式更加简洁易用,建议使用现代方式。仅当图片非常复杂或不规则时,才推荐使用常规方式。

模块:subplot

3.1子图布局

subplot begin 用于设计子图的布局、尺寸以及其它属性。

相邻子图之间的间隔则可以用 -M 选项控制。

subplot set 用于激活指定的子图,接下来的所有绘图命令都将在该子图内进行绘制。

GMT中可以通过 行号,列号 或者 索引号 (即第几个子图)的方式来指定子图。

行号、列号和索引号,均从0开始起算。因而对于一个N行M列的子图布局而言,行号为0到N-1,列号为0到M-1,索引号为0到N*M-1。

命令:gmt subplot begin 2x3 -Fs5c/3c

解释:定义了一个2行3列的子图布局。-Fs5c/3c 则指定了每个子图区域的宽度为5厘米,高度为3厘米。

命令:gmt subplot set 1,0 或 gmt subplot set 3

解释:1,0即为行号和列号,3为索引号

使用 subplot end 退出子图模式,命令:gmt subplot end

3.2第一张子图

命令:

gmt begin map png,pdf
  gmt set FONT_TAG 15p FONT_HEADING 20p MAP_HEADING_OFFSET 0p
  gmt subplot begin 2x2 -Fs5c/3c -A -M0.2c/0.1c -T"My Subplot Heading"
    gmt subplot set 0
    gmt basemap -R0/10/0/10 -JX? -Baf -BWSen

    gmt subplot set 1
    gmt basemap -R0/20/0/10 -JX? -Baf -BWSen

    gmt subplot set 2
    gmt basemap -R0/10/0/20 -JX? -Baf -BWSen

    gmt subplot set 3
    gmt basemap -R0/20/0/20 -JX? -Baf -BWSen
  gmt subplot end
gmt end show

解释:

  • 调整子图编号的大小(FONT_TAG)、总标题文字大小(FONT_HEADING)以及总标题相对于底图的偏移量(MAP_HEADING_OFFSET
  • 用 subplot begin 定义了一个2行2列(2x2)的子图布局,每个子图区域宽5厘米高3厘米(-Fs5c/3c)
  • -A: 对每个子图进行自动编号abcd
  • -M0.2c/0.1c: 调整相邻子图之间的空白距离,X方向间隔为0.2厘米,Y方向间隔为0.1厘米
  • -T”My Subplot Heading”: 为整张图加上一个总标题
  • 在子图模式内,使用 subplot set 0 的方式依次激活每个子图。
  • 在每个子图内绘图时,我们使用了线性投影方式 -JX?。通常需要指定图片的宽度或高度,这里使用了 ? 让GMT根据子图区域的大小自动帮我们选择最合适的子图宽度。

3.3共用X/Y轴

命令:

gmt begin map png,pdf
  gmt set FONT_TAG 15p FONT_HEADING 20p MAP_HEADING_OFFSET 10p
  gmt subplot begin 2x2 -Fs5c/3c -A -M0.2c/0.2c -T"My Subplot Heading" -SRl -SCb -BWSrt
    gmt basemap -R0/10/0/10 -JX? -c
    gmt basemap -R0/20/0/10 -JX? -c
    gmt basemap -R0/10/0/20 -JX? -c
    gmt basemap -R0/20/0/20 -JX? -c
  gmt subplot end
gmt end show

解释:

  • -SRl 表示一行内(Row)的子图共用Y轴,且只在左边(l)轴显示标注,
  • -SCb 表示一列内(Column)的子图共用X轴,且只在底部(b)轴显示标注。

3.4复杂布局

命令:

gmt begin complex-subplot png,pdf
  gmt subplot begin 2x2 -Fs5c/3c -A
    gmt subplot set 0 -A'(a)'
    gmt basemap -R0/10/0/10 -JX11.75c/3c -Baf -BWSen
    echo 5 5 TEXT | gmt text -JX11.75c/3c
    gmt subplot set 2 -A'(b)'
    gmt basemap -R0/5/0/5 -JX? -Baf -BWSen
    gmt subplot set 3 -A'(c)'
    gmt basemap -R0/5/0/5 -JX? -Baf -BWSen
  gmt subplot end
gmt end show

在一个2行2列的子图布局中绘制了三张子图,其中第一张子图占据了第一行。

在绘制三个底图时,后两个底图均使用了 -JX?,因而GMT会自动根据子图区域的大小确定子图的尺寸;而为了使得第一张子图占据两个子图区域的空间,我们使用了 -JX11.75c/3c 来人工指定其子图宽度,其中子图宽度11.75厘米是需要人工调整的。

由于我们跳过了第二个子图区域,自动标签功能会将三个子图依次编号为a、c、d,这显然不是我们想要的,因而我们使用了 -A’(a)’ 选项手动设置子图编号。需要注意的是,由于小括号在Bash中有特殊含义,所以这里 (a) 两边加了单引号以避免Bash对小括号进行解释。

4.多图模式

原文地址:GMT多图模式 — GMT中文手册

模块:figure

可以在 gmt begin 和 gmt end 中多次使用 gmt figure 来创建新图,或激活已有的图。

命令:

gmt begin
    # 创建 Fig1 并在 Fig1 中绘图
    gmt figure Fig1 png
    gmt basemap -R0/10/0/10 -JX10c -Baf

    # 创建 Fig2 并在 Fig2 中绘图
    gmt figure Fig2 png
    gmt basemap -R0/5/0/5 -JX10c -Baf

    # 切换回 Fig1,并绘制圆圈
    gmt figure Fig1
    echo 5 5 | gmt plot -Sc1c -W2p

    # 切换回 Fig2,并绘制三角形
    gmt figure Fig2
    echo 1 2 | gmt plot -St1c -W1p
gmt end show

使用 figure 模块在一个脚本中指定了两张图,并不断在两张图之间来回切换,最终会生成两张图,第一张图中在底图中绘制了圆圈,第二张图中则在底图中绘制了三角形。