绘制颜色渐变的线条

想要绘制一条颜色变化的线段,下面是演示代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
# GMT v5.2.1
gmt makecpt -Crainbow -T-2/2/1 > lines.cpt
gmt psxy -JX15c/4c -R0/6/0/4 -B1 -Clines.cpt -W2p > test.ps << EOF
> -Z-1.5
1 2
2 2
> -Z-0.5
2 2
3 2
> -Z0.5
3 2
4 2
> -Z1.5
4 2
5 2
EOF

绘图效果如下图:

简单解释一下:

  1. makecpt 命令制作了一个 - 2 到 2 间隔为 1 的 CPT 文件
  2. psxy 命令中使用了 -C 选项,此时需要输入数据是多段表数据,且每段数据的段头记录中,需要有 -Z<val> 以指定每段数据的 Z 值
  3. 实际绘图时,对于每段数据,命令会读取该数据数据的段头记录中的 -Z<val> 中的 Z 值,然后到 CPT 文件中查找 Z 值所对应的颜色,作为该段线段的颜色

实际绘图时,可能遇到的情况是:已知 A 点和 B 点的 Z 值,A 点到 B 点连线上 Z 值渐变,想要通过线条颜色的渐变来体现 Z 值的渐变。此时需要一些额外的处理,其中涉及到一些编程,所以下面仅提供思路。

已知 A 点和 B 点坐标,利用如下命令将 A 到 B 的连线等分成若干份:

gmt project -C<xA>/<yA> -E<xB>/<yB> -G<dist>

其中 -C 后接 A 点坐标, -E 后接 B 点坐标, -G 后接等分后相邻两点间的距离。 <dist> 越小,A 到 B 线段的颜色变化就越平滑。

最终输出的结果中有三列数据:X 坐标、Y 坐标和与 A 点的距离。对于生成的每个点而言,根据 A 和 B 两点的 Z 值、A 和 B 两点之间的距离以及该点与 A 点之间的距离,通过简单的线性插值,即可得到每一点的 Z 值。

有了 AB 之间每一点的坐标和 Z 值,就可以构建如上例所示的多段数据。对于每段数据而言,其 Z 值可以取该段数据首尾两点 Z 值的平均,或者其他取法亦可。