入门 可视化
graphics.py是OGGM的可视化模块。尽管在代码量上(约32KB)不及workflow.py等核心模块,但它提供了从冰川几何到模型诊断的全面可视化功能。本章系统介绍各类型图表的绘制函数、底层基础设施、以及与GriddedNcdfFile的集成。
正式分析前至少应查看四类图:冰川轮廓与DEM是否对齐、中心线是否沿主流方向、反演厚度是否集中在合理位置、模型诊断时间序列是否有突跳。很多区域统计错误都能在这四类图中提前发现。
| 想检查什么 | 推荐图 | 异常信号 |
|---|---|---|
| RGI边界和DEM | plot_domain | 轮廓错位、DEM空洞、边界太小 |
| 中心线和支流 | plot_centerlines | 中心线过短、穿出冰川、支流汇合异常 |
| 反演厚度 | plot_inversion或自定义剖面图 | 厚度集中在末端、局部尖峰、体积异常 |
| 模拟输出 | plot_modeloutput_timeseries | 体积/面积突然跳变、长度不合理增长 |
graphics.py基于matplotlib构建,封装了OGGM特定的可视化逻辑。它的设计遵循几个核心原则:
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的标识和文档。
OGGM定义了一套标准颜色映射和配色方案,所有图表函数共享:
所有绘图函数通过统一的保存接口输出图形,支持可配置的分辨率(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')
plot_domain是最常用的入门级绘图函数。它以单个图形展示冰川的完整空间范围:
plot_domain(gdir, ax=None, title=True,
add_colorbar=True, add_scale_bar=True)
该函数在一个图中叠加以下元素:
在开发新的冰川目录(GlacierDirectory)处理流程时,plot_domain是验证格网定义和数据完整性的第一道防线。如果DEM投影错误、格网偏移或流线计算异常,这些都能在概览图中立即显现。
plot_centerlines专门可视化中心线计算结果:
plot_centerlines(gdir, ax=None, title=True,
use_flowlines=False, add_scale_bar=True)
参数解析:
use_flowlines=False(默认):绘制几何中心线(由中心线算法生成),以线条粗细表示冰川宽度。use_flowlines=True:绘制离散化后的流线(由flowline discretization生成),宽度变化通过streamplot或填充多边形表示。每条流线的宽度编码了集水区几何信息,主线和支流以不同颜色区分。这种可视化对于诊断流线网络的拓扑正确性至关重要——例如检测支流是否与主线正确相交、宽度是否在交汇处平滑过渡。
plot_catchment_width将冰川几何沿流线的分布以曲线图形式展示。该函数绘制两个关键诊断量:
这些曲线对于反演和模型模拟是输入参数,因此可视化检查它们的平滑性和物理合理性是质量控制的重要步骤。
OGGM的温度指数模型(temperature-index model)将物质平衡表达为海拔的函数。该函数绘制三种关键曲线:
plot_mass_balance_grad(gdir, ax=None, title=True)
图表中显示:
这种可视化直接反映了物质平衡校准的质量——如果ELA偏离观测值过多,mu*的调整可能有问题。
这两个函数以时间序列形式展示物质平衡:
plot_mb_ts:给定气候序列下的年际物质平衡变化,叠加累积物质平衡曲线。累积曲线向下倾斜表示冰川净质量减少。plot_annual_mb_ts:以热力图形式展示每条高度带的年度物质平衡,x轴为时间,y轴为海拔,颜色编码物质平衡数值。plot_annual_mb_ts可以直观发现气候驱动事件——例如特别极端的一年会导致从积累区到消融区的整体负异常,在热力图上表现为单一的垂直暗带。
模型输出可视化是graphics.py最复杂也最有价值的部分。三个核心函数覆盖了空间、剖面和时间三个维度。
从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) | 蓝白红发散 |
该函数处理从流线坐标到地理坐标的重映射和格网插值,确保输出与地理参考对齐。
这是OGGM的核心诊断可视化:沿主要流线的冰川横截面和纵剖面。一个典型的剖面图包含五个面板:
plot_modeloutput_section(gdir, ax=None,
model_results_path=None,
title=True)
五个面板布局为:
这五个面板提供了对冰川动力学的一站式可视化。例如,冰流通量与宽度和厚度的关系可以验证物质守恒是否正确求解。
绘制模型运行期间冰川关键指标的时间演变:
plot_modeloutput_timeseries(gdir,
model_results_path=None,
axs=None,
title=True)
绘制以下时间序列:
plot_inversion是验证冰厚反演质量的核心工具。它对比反演的冰厚与可用观测数据(如雷达测厚、Farinotti共识估计等):
plot_inversion(gdir, ax=None, title=True,
linewidth=2, varname='volume')
图形类型取决于varname参数:
varname='volume':散点图,x轴为观测体积,y轴为反演体积。对角线表示完美匹配。varname='thickness':沿流线的冰厚剖面,叠加观测厚度点。在L3(反演级别)完成后,应始终使用此函数检查反演质量。系统性偏差(如反演厚度持续偏高)可能表示Glen A参数需要重新校准。
如果可用(如ITS_LIVE数据已通过--add-itslive-velocity添加到L3),该函数将模拟的冰川表面速度与卫星观测的冰川表面速度进行对比。
生成印刷品质的冰川冰厚分布专题地图,包含完整的图例、比例尺和标题。与plot_modeloutput_map(variable='thickness')不同,plot_thickness_map专注于冰厚这一核心科学生产,提供更精美的默认呈现。
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)的可视化逻辑,包括投影转换、颜色映射、等值线和矢量箭头叠加。
所有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')
创建自定义绘图函数需要遵从graphics.py的约定:
gdir和ax=Noneax为None,在函数内创建新的figure和axes_savefig统一保存接口(或直接调用fig.savefig)| 格式 | 特点 | 推荐用途 |
|---|---|---|
| PNG | 高分辨率位图(150-600 dpi) | 论文发表、演示、网页 |
| 矢量图形,无损缩放 | 出版级插图、LaTeX文档 | |
| SVG | 可编辑矢量图形 | 后期编辑(Inkscape/Illustrator)、网页 |
通过cfg.PARAMS中的plot_dpi参数控制默认分辨率。对于论文发表的图形,建议设置plot_dpi=300并使用PDF格式以保留矢量可编辑性。
graphics.py将OGGM的复杂科学输出转换为直观的出版物级图形。从冰川几何、物质平衡梯度到完整的模型剖面和时间序列,每个函数都经过精心设计以服务于科学分析和质量诊断的双重目的。理解这些可视化工具的含义和使用方法,是高效解读OGGM模型输出的基础技能。