✍️ 陈箫翰

# 等间隔数据网格化绘图

在实际科研工作中，经常会通过程序计算产出科研数据。一类常见的数据形式就是在经度和纬度方向上（或是笛卡尔座标系中X和Y方向）等间隔分布的数据。 本章我们讨论其中最简单的一种类型：存储为ASCII文本文件的 x,y,z 值数据。这类数据每一行是一个数据点，前两列为座标，第三列是数值。 在两个方向上，数据点分别都是等间隔分布的。但经度方向（X方向）和纬度方向（Y方向）的间隔可以不一样。 例如经度方向数据点间隔是5弧分，纬度方向数据点间隔可以是3弧分。

以下是数据格式的一个简单示例，该数据是夏威夷区域的GEOID数据。 示例数据下载 `HI_geoid_04.xyz`：

    # 笛卡尔座标系：X座标 Y座标 Z值
    # 地理座标系：经度 纬度 数值

    # 经纬度方向数据点的间隔都是5弧分，即0.083333..度
    # 数据点先沿经度方向排列
    195             25  1.88000011444
    195.083333333   25  1.88100004196
    195.166666667   25  1.87800014019
    195.25          25  1.87800014019
    ...

## 获取数据基本信息

用户可以使用 info 模块获取数据各列的极值信息，便于接下来的作图：

    $ gmt info HI_geoid_04.xyz
    HI_geoid_04.xyz: N = 15385      <195/210>       <18/25> <-0.516000032425/14.9390010834>

从输出中可以看到，文件共有15385行，以及三列数据的数据范围。

## 数据网格化并绘图

等间隔数据使用 xyz2grd 模块转化为 grid 网格文件，并使用 grdimage 模块读取网格文件绘制图片。

    R=195/210/18/25

    gmt begin map
        gmt xyz2grd HI_geoid_04.xyz -R${R} -I5m -GHI_geoid_04.grd

        gmt basemap -R${R} -JM15c -Baf
        gmt makecpt -Cturbo -T-1/15
        gmt grdimage HI_geoid_04.grd
        gmt colorbar -Bxaf+l"GEOID (m)"

        rm HI_geoid_04.grd
    gmt end show

前面获取的数据范围信息帮助我们确定了 -R 选项的参数，以及 makecpt 中 -T 选项的参数。 我们假定数据由用户自己计算生成，因此知道数据点的间隔。用户需要使用 xyz2grd 中的 -I 选项告诉GMT数据点的间隔。 示例数据中经纬度方向的数据点间隔都是5弧分，因此可以简化设置为 -I5m 。假如两个方向的数据点间隔不同，则需要分别设置（例如 -I5m/3m ）。

此外， xyz2grd 模块使用的 -R 选项范围可以与数据范围不同，也可以和作图范围不同。 下面的例子中，我们使用了一个更小的 -R 对数据进行网格化，相当于只选取一部分数据。

    R1=202/204/20/22
    R2=195/210/18/25

    gmt begin map2
        gmt xyz2grd HI_geoid_04.xyz -R${R1} -I5m -GHI_geoid_04.grd

        gmt basemap -R${R2} -JM15c -Baf
        gmt coast -G244/243/239 -S167/194/223
        gmt makecpt -Crainbow -T-1/15
        gmt grdimage HI_geoid_04.grd -Q
        gmt coast -W1p
        gmt colorbar -DJRM+o1c/0+e+mc -Bx2+l"GEOID (m)"

        rm HI_geoid_04.grd
    gmt end show

如果用户的数据中有一部分区域是缺失的，那么默认情况下缺失数据的区域会被填充为灰色。 可以使用 grdimage 模块中的 -Q 选项令缺失数据的区域透明化。