1. 从数据到图形海温异常分析全流程海温异常分析是气候研究中的重要手段它能直观展示海洋温度偏离长期平均状态的程度。我最近用Python处理ERA5数据绘制了2023年冬季全球海温异常图整个过程涉及数据处理、计算和可视化多个环节。先说说为什么要关注海温异常 - 海洋覆盖了地球71%的面积其温度变化直接影响全球气候模式。ERA5是欧洲中期天气预报中心ECMWF发布的第五代再分析数据集它通过数据同化技术将观测资料与数值模式相结合。虽然再分析数据不是直接观测结果但其时空连续性远超实测数据。我使用的月平均海温数据时间跨度为1940-2023年空间分辨率为1°×1°这个分辨率对于全球尺度分析已经足够。处理这类数据时xarray库是Python生态中的利器。它专门为多维数组设计能优雅地处理带坐标标记的数据集。第一次接触气象数据的朋友可能会被nc文件格式吓到其实用xarray打开只需一行代码import xarray as xr ds xr.open_dataset(ERA5_sst_1940_202307.nc)2. 数据预处理与气候态计算计算气候态是分析异常值的基础。根据世界气象组织建议我选择1991-2020年作为气候基准期。这里有个细节需要注意 - 气象学上的冬季包含前一年12月和当年1、2月这种跨年定义初学者容易忽略。提取冬季数据时xarray的dt访问器特别方便。比如筛选所有冬季月份可以这样操作winter_months [12, 1, 2] sst_winter ds.sst.where(ds.time.dt.month.isin(winter_months), dropTrue)计算30年气候态时我最初犯了个错误 - 直接对整个时间段取平均忽略了每年冬季包含3个月的事实。正确做法应该是先计算各年冬季平均再对年际序列取平均。用numpy实现这个逻辑# 按年分组计算冬季平均 yearly_winter sst_winter.groupby(time.year).mean(dimtime) # 计算气候态 climatology yearly_winter.sel(yearslice(1991,2020)).mean(dimyear)处理2023年数据时要注意时间范围包含2022年12月。我见过有人直接用2023年1-12月数据这样会漏掉关键的12月数据。正确的切片方式sst_2023 sst_winter.sel(timeslice(2022-12,2023-02))3. 地图投影与可视化技巧Cartopy是Python中最专业的地图绘制库之一。设置中心经度180度时新手常会遇到地图显示不全的问题。关键在于正确设置PlateCarree投影的central_longitude参数import cartopy.crs as ccrs proj ccrs.PlateCarree(central_longitude180)填色图的关键参数是色阶(levels)和色标(colormap)。经过多次测试我发现RdBu_r色系红蓝反转最适合展示温度异常它能自然区分冷暖异常并将零值附近设为白色。设置色阶时要考虑数据实际范围levels np.arange(-3, 3.1, 0.5) # 从-3到3间隔0.5 cmap plt.get_cmap(RdBu_r)添加地图元素时海岸线分辨率选择很重要。50m分辨率在全局尺度下足够清晰更高分辨率会拖慢渲染速度。Cartopy内置了多种比例尺的自然地理特征import cartopy.feature as cfeature ax.add_feature(cfeature.COASTLINE.with_scale(50m)) ax.add_feature(cfeature.LAND, facecolorlightgray)4. 完整代码实现与优化建议将上述步骤整合这是经过实战检验的完整代码框架import numpy as np import matplotlib.pyplot as plt import xarray as xr import cartopy.crs as ccrs import cartopy.feature as cfeature # 数据读取与处理 ds xr.open_dataset(ERA5_sst_1940_202307.nc) winter ds.sst.where(ds.time.dt.month.isin([12,1,2]), dropTrue) # 计算气候态(1991-2020) clim winter.sel(timeslice(1991,2020)).groupby(time.year).mean(time).mean(year) # 处理2023年冬季 sst_2023 winter.sel(timeslice(2022-12,2023-02)).mean(time) # 计算异常 anomaly sst_2023 - clim # 绘图设置 fig plt.figure(figsize(15,8)) proj ccrs.PlateCarree(central_longitude180) ax fig.add_subplot(111, projectionproj) ax.set_global() # 绘制填色图 cf ax.contourf(anomaly.longitude, anomaly.latitude, anomaly, levelsnp.linspace(-3,3,21), cmapRdBu_r, transformccrs.PlateCarree()) # 添加地理要素 ax.add_feature(cfeature.COASTLINE.with_scale(50m)) ax.add_feature(cfeature.LAND, facecolorlightgray) # 添加colorbar cbar plt.colorbar(cf, orientationhorizontal, shrink0.7) cbar.set_label(Sea Surface Temperature Anomaly (°C)) plt.title(2023 Winter SST Anomaly Relative to 1991-2020 Climatology) plt.show()几个优化建议第一处理大数据时可以先用ds.isel(timeslice(0,100))选取子集进行调试第二保存图片时推荐使用plt.savefig(output.png, dpi300, bbox_inchestight)保证输出质量第三使用Dask可以高效处理超出内存的大数据集。
Python气象可视化实战:绘制全球海温异常分布图
发布时间:2026/7/8 8:18:51
1. 从数据到图形海温异常分析全流程海温异常分析是气候研究中的重要手段它能直观展示海洋温度偏离长期平均状态的程度。我最近用Python处理ERA5数据绘制了2023年冬季全球海温异常图整个过程涉及数据处理、计算和可视化多个环节。先说说为什么要关注海温异常 - 海洋覆盖了地球71%的面积其温度变化直接影响全球气候模式。ERA5是欧洲中期天气预报中心ECMWF发布的第五代再分析数据集它通过数据同化技术将观测资料与数值模式相结合。虽然再分析数据不是直接观测结果但其时空连续性远超实测数据。我使用的月平均海温数据时间跨度为1940-2023年空间分辨率为1°×1°这个分辨率对于全球尺度分析已经足够。处理这类数据时xarray库是Python生态中的利器。它专门为多维数组设计能优雅地处理带坐标标记的数据集。第一次接触气象数据的朋友可能会被nc文件格式吓到其实用xarray打开只需一行代码import xarray as xr ds xr.open_dataset(ERA5_sst_1940_202307.nc)2. 数据预处理与气候态计算计算气候态是分析异常值的基础。根据世界气象组织建议我选择1991-2020年作为气候基准期。这里有个细节需要注意 - 气象学上的冬季包含前一年12月和当年1、2月这种跨年定义初学者容易忽略。提取冬季数据时xarray的dt访问器特别方便。比如筛选所有冬季月份可以这样操作winter_months [12, 1, 2] sst_winter ds.sst.where(ds.time.dt.month.isin(winter_months), dropTrue)计算30年气候态时我最初犯了个错误 - 直接对整个时间段取平均忽略了每年冬季包含3个月的事实。正确做法应该是先计算各年冬季平均再对年际序列取平均。用numpy实现这个逻辑# 按年分组计算冬季平均 yearly_winter sst_winter.groupby(time.year).mean(dimtime) # 计算气候态 climatology yearly_winter.sel(yearslice(1991,2020)).mean(dimyear)处理2023年数据时要注意时间范围包含2022年12月。我见过有人直接用2023年1-12月数据这样会漏掉关键的12月数据。正确的切片方式sst_2023 sst_winter.sel(timeslice(2022-12,2023-02))3. 地图投影与可视化技巧Cartopy是Python中最专业的地图绘制库之一。设置中心经度180度时新手常会遇到地图显示不全的问题。关键在于正确设置PlateCarree投影的central_longitude参数import cartopy.crs as ccrs proj ccrs.PlateCarree(central_longitude180)填色图的关键参数是色阶(levels)和色标(colormap)。经过多次测试我发现RdBu_r色系红蓝反转最适合展示温度异常它能自然区分冷暖异常并将零值附近设为白色。设置色阶时要考虑数据实际范围levels np.arange(-3, 3.1, 0.5) # 从-3到3间隔0.5 cmap plt.get_cmap(RdBu_r)添加地图元素时海岸线分辨率选择很重要。50m分辨率在全局尺度下足够清晰更高分辨率会拖慢渲染速度。Cartopy内置了多种比例尺的自然地理特征import cartopy.feature as cfeature ax.add_feature(cfeature.COASTLINE.with_scale(50m)) ax.add_feature(cfeature.LAND, facecolorlightgray)4. 完整代码实现与优化建议将上述步骤整合这是经过实战检验的完整代码框架import numpy as np import matplotlib.pyplot as plt import xarray as xr import cartopy.crs as ccrs import cartopy.feature as cfeature # 数据读取与处理 ds xr.open_dataset(ERA5_sst_1940_202307.nc) winter ds.sst.where(ds.time.dt.month.isin([12,1,2]), dropTrue) # 计算气候态(1991-2020) clim winter.sel(timeslice(1991,2020)).groupby(time.year).mean(time).mean(year) # 处理2023年冬季 sst_2023 winter.sel(timeslice(2022-12,2023-02)).mean(time) # 计算异常 anomaly sst_2023 - clim # 绘图设置 fig plt.figure(figsize(15,8)) proj ccrs.PlateCarree(central_longitude180) ax fig.add_subplot(111, projectionproj) ax.set_global() # 绘制填色图 cf ax.contourf(anomaly.longitude, anomaly.latitude, anomaly, levelsnp.linspace(-3,3,21), cmapRdBu_r, transformccrs.PlateCarree()) # 添加地理要素 ax.add_feature(cfeature.COASTLINE.with_scale(50m)) ax.add_feature(cfeature.LAND, facecolorlightgray) # 添加colorbar cbar plt.colorbar(cf, orientationhorizontal, shrink0.7) cbar.set_label(Sea Surface Temperature Anomaly (°C)) plt.title(2023 Winter SST Anomaly Relative to 1991-2020 Climatology) plt.show()几个优化建议第一处理大数据时可以先用ds.isel(timeslice(0,100))选取子集进行调试第二保存图片时推荐使用plt.savefig(output.png, dpi300, bbox_inchestight)保证输出质量第三使用Dask可以高效处理超出内存的大数据集。