第18章 图形与可视化

入门 可视化

graphics.py是OGGM的可视化模块。尽管在代码量上(约32KB)不及workflow.py等核心模块,但它提供了从冰川几何到模型诊断的全面可视化功能。本章系统介绍各类型图表的绘制函数、底层基础设施、以及与GriddedNcdfFile的集成。

应用研究的最低作图清单

正式分析前至少应查看四类图:冰川轮廓与DEM是否对齐、中心线是否沿主流方向、反演厚度是否集中在合理位置、模型诊断时间序列是否有突跳。很多区域统计错误都能在这四类图中提前发现。

想检查什么推荐图异常信号
RGI边界和DEMplot_domain轮廓错位、DEM空洞、边界太小
中心线和支流plot_centerlines中心线过短、穿出冰川、支流汇合异常
反演厚度plot_inversion或自定义剖面图厚度集中在末端、局部尖峰、体积异常
模拟输出plot_modeloutput_timeseries体积/面积突然跳变、长度不合理增长

18.1 模块架构概览

graphics.py基于matplotlib构建,封装了OGGM特定的可视化逻辑。它的设计遵循几个核心原则:

18.2 图形基础设施

18.2.1 字体与排版

OGGM在字体支持上追求专业品质。当系统安装了Google Rockefeller Building字体(OGGM品牌字体)时,graphics.py自动使用该字体渲染图表文本。否则回退到matplotlib默认字体。

def _check_rockefeller_font():
    """Check for the Google Rockefeller Building font."""
    from matplotlib.font_manager import findfont, FontProperties
    font = findfont(FontProperties(family='Rockefeller'))
    return font != FontProperties().get_file()

这一设计体现了OGGM对图表美观的重视。Rockefeller Building字体是一种圆润的几何无衬线字体,用于OGGM的标识和文档。

18.2.2 色彩方案

OGGM定义了一套标准颜色映射和配色方案,所有图表函数共享:

18.2.3 图形保存

所有绘图函数通过统一的保存接口输出图形,支持可配置的分辨率(dpi)和多格式输出:

def _savefig(fig, path, dpi=None):
    """Centralized figure saving with configurable resolution."""
    if dpi is None:
        dpi = cfg.PARAMS.get('plot_dpi', 150)
    fig.savefig(path, dpi=dpi, bbox_inches='tight', facecolor='w')

18.3 冰川几何可视化

18.3.1 plot_domain:冰川全貌概览

plot_domain是最常用的入门级绘图函数。它以单个图形展示冰川的完整空间范围:

plot_domain(gdir, ax=None, title=True,
            add_colorbar=True, add_scale_bar=True)

该函数在一个图中叠加以下元素:

在开发新的冰川目录(GlacierDirectory)处理流程时,plot_domain是验证格网定义和数据完整性的第一道防线。如果DEM投影错误、格网偏移或流线计算异常,这些都能在概览图中立即显现。

18.3.2 plot_centerlines:流线网络

plot_centerlines专门可视化中心线计算结果:

plot_centerlines(gdir, ax=None, title=True,
                 use_flowlines=False, add_scale_bar=True)

参数解析:

每条流线的宽度编码了集水区几何信息,主线和支流以不同颜色区分。这种可视化对于诊断流线网络的拓扑正确性至关重要——例如检测支流是否与主线正确相交、宽度是否在交汇处平滑过渡。

18.3.3 plot_catchment_width:集水区几何

plot_catchment_width将冰川几何沿流线的分布以曲线图形式展示。该函数绘制两个关键诊断量:

这些曲线对于反演和模型模拟是输入参数,因此可视化检查它们的平滑性和物理合理性是质量控制的重要步骤。

18.4 物质平衡可视化

18.4.1 plot_mass_balance_grad:物质平衡梯度

OGGM的温度指数模型(temperature-index model)将物质平衡表达为海拔的函数。该函数绘制三种关键曲线:

plot_mass_balance_grad(gdir, ax=None, title=True)

图表中显示:

这种可视化直接反映了物质平衡校准的质量——如果ELA偏离观测值过多,mu*的调整可能有问题。

18.4.2 plot_mb_ts 和 plot_annual_mb_ts

这两个函数以时间序列形式展示物质平衡:

实践建议 使用plot_annual_mb_ts可以直观发现气候驱动事件——例如特别极端的一年会导致从积累区到消融区的整体负异常,在热力图上表现为单一的垂直暗带。

18.5 模型输出可视化

模型输出可视化是graphics.py最复杂也最有价值的部分。三个核心函数覆盖了空间、剖面和时间三个维度。

18.5.1 plot_modeloutput_map:2D厚度与速度图

GriddedNcdfFile中提取格网化的模型输出并将其渲染为地理地图:

plot_modeloutput_map(gdir, ax=None,
                     variable='thickness',
                     model_results_path=None,
                     add_colorbar=True,
                     title=True)

支持的可视化变量包括:

变量含义推荐色图
thickness冰川厚度(米)蓝白红(厚-薄)
velocity表面速度(米/年)暖色渐层
surface_h表面高程(米)地形色图
mass_balance物质平衡(mm w.e. yr⁻¹,毫米水当量 water equivalent)蓝白红发散

该函数处理从流线坐标到地理坐标的重映射和格网插值,确保输出与地理参考对齐。

18.5.2 plot_modeloutput_section:流线剖面图

这是OGGM的核心诊断可视化:沿主要流线的冰川横截面和纵剖面。一个典型的剖面图包含五个面板:

plot_modeloutput_section(gdir, ax=None,
                         model_results_path=None,
                         title=True)

五个面板布局为:

  1. 冰床与表面高程:沿流线方向(x轴)的冰川表面和底部高程曲线,填充冰川体积。
  2. 冰厚剖面:沿流线的冰厚变化。
  3. 冰川宽度:沿流线的宽度曲线。
  4. 冰流通量:沿流线的冰体积通量(单位时间通过横截面的冰量)。
  5. 表面速度:沿流线的模拟表面速度。

这五个面板提供了对冰川动力学的一站式可视化。例如,冰流通量与宽度和厚度的关系可以验证物质守恒是否正确求解。

18.5.3 plot_modeloutput_timeseries:时间序列

绘制模型运行期间冰川关键指标的时间演变:

plot_modeloutput_timeseries(gdir,
                            model_results_path=None,
                            axs=None,
                            title=True)

绘制以下时间序列:

深入理解 冰川长度对气候变化的响应具有滞后性(通常数年)。可以通过比较体积和长度的时间序列来估计冰川响应时间——体积对气候变化的响应更即时(因为厚度变化直接影响体积),而长度需要冰动力学传播,因此滞后更明显。

18.6 诊断可视化

18.6.1 plot_inversion:反演结果诊断

plot_inversion是验证冰厚反演质量的核心工具。它对比反演的冰厚与可用观测数据(如雷达测厚、Farinotti共识估计等):

plot_inversion(gdir, ax=None, title=True,
               linewidth=2, varname='volume')

图形类型取决于varname参数:

在L3(反演级别)完成后,应始终使用此函数检查反演质量。系统性偏差(如反演厚度持续偏高)可能表示Glen A参数需要重新校准。

18.6.2 plot_velocity:表面速度对比

如果可用(如ITS_LIVE数据已通过--add-itslive-velocity添加到L3),该函数将模拟的冰川表面速度与卫星观测的冰川表面速度进行对比。

18.6.3 plot_thickness_map:冰厚专题图

生成印刷品质的冰川冰厚分布专题地图,包含完整的图例、比例尺和标题。与plot_modeloutput_map(variable='thickness')不同,plot_thickness_map专注于冰厚这一核心科学生产,提供更精美的默认呈现。

18.7 GriddedNcdfFile集成

OGGM的格网化输出使用GriddedNcdfFile格式(基于NetCDF)。graphics.py中的地图类函数(plot_modeloutput_map)直接读取此格式并进行可视化:

# 典型使用工作流
from oggm import GraphicsGridded, GriddedNcdfFile

# 加载格网化输出
gridded = GriddedNcdfFile(path_to_gridded_output)

# 创建可视化器并绑定格网数据(gridded data)
graphics = GraphicsGridded(gridded)

# 绘制厚度图和速度图
graphics.plot_thickness()
graphics.plot_velocity()

GraphicsGridded类封装了格网数据(gridded data)的可视化逻辑,包括投影转换、颜色映射、等值线和矢量箭头叠加。

18.8 扩展与自定义

18.8.1 基于Matplotlib的自定义

所有OGGM绘图函数都返回matplotlib axes对象,这使得用户可以在默认图形上叠加自定义内容。例如,在domain图上标注特定研究点位:

fig, ax = plt.subplots(figsize=(10, 8))
plot_domain(gdir, ax=ax)
ax.scatter(lon_point, lat_point, c='red', marker='*',
           s=200, label='Research site')
ax.legend()
plt.savefig('custom_domain.png', dpi=300, bbox_inches='tight')

18.8.2 创建自定义可视化函数

创建自定义绘图函数需要遵从graphics.py的约定:

  1. 函数前两个参数应为gdirax=None
  2. 如果ax为None,在函数内创建新的figure和axes
  3. 返回axes对象供调用者进一步修改
  4. 使用_savefig统一保存接口(或直接调用fig.savefig)

18.9 图形导出格式

格式特点推荐用途
PNG高分辨率位图(150-600 dpi)论文发表、演示、网页
PDF矢量图形,无损缩放出版级插图、LaTeX文档
SVG可编辑矢量图形后期编辑(Inkscape/Illustrator)、网页

通过cfg.PARAMS中的plot_dpi参数控制默认分辨率。对于论文发表的图形,建议设置plot_dpi=300并使用PDF格式以保留矢量可编辑性。

18.10 小结

graphics.py将OGGM的复杂科学输出转换为直观的出版物级图形。从冰川几何、物质平衡梯度到完整的模型剖面和时间序列,每个函数都经过精心设计以服务于科学分析和质量诊断的双重目的。理解这些可视化工具的含义和使用方法,是高效解读OGGM模型输出的基础技能。

上一章:第17章 MPI并行计算 下一章:附录