
从ERA5数据到专业气象图Python自动化绘制温度距平图的完整工作流气象数据分析正经历着从手工操作到自动化流程的变革。对于气候研究人员和数据分析师来说构建一套可靠的数据处理与可视化管道不仅能节省大量重复劳动还能确保分析结果的一致性和可重复性。本文将展示如何利用Python生态中的xarray、Cartopy和cnmaps等工具打造一个端到端的温度距平分析系统——从原始ERA5数据下载到专业级气象图的自动生成。1. ERA5数据获取与预处理ERA5作为欧洲中期天气预报中心ECMWF提供的第五代再分析数据已成为气候研究的重要数据源。其每小时/月平均的地表温度数据t2m覆盖全球空间分辨率达0.25°×0.25°。获取这些数据的第一步是注册ECMWF的CDS API账号import cdsapi c cdsapi.Client() request { product_type: monthly_averaged_reanalysis, variable: 2m_temperature, year: [1950, 2023], month: [06, 07, 08], # 北半球夏季 time: 00:00, format: netcdf, area: [55, 70, 0, 140], # 北纬55°-0°东经70°-140° } c.retrieve(reanalysis-era5-single-levels-monthly-means, request, t2m_cn_jja_1950-2023.nc)数据下载后使用xarray进行高效处理是其优势所在。这个库专为多维数组设计特别适合气象数据的时空分析import xarray as xr ds xr.open_dataset(t2m_cn_jja_1950-2023.nc) t2m ds[t2m] # 获取温度变量距平计算是气候分析的核心步骤它反映了当前温度与长期平均状态的偏离。xarray的链式操作让这一过程变得直观climatology t2m.mean(dimtime) # 计算1950-2023年夏季平均 anomaly t2m.isel(time-1) - climatology # 计算最近一年的距平2. 地理数据处理与区域掩膜专业气象制图需要精确的地理边界处理。cnmaps库提供了中国行政区划的高精度矢量数据配合Cartopy的地理坐标转换功能可以实现准确的空间掩膜from cnmaps import get_adm_maps # 获取中国陆地多边形包含南海诸岛 china_polygon get_adm_maps(level国, only_polygonTrue, recordfirst) # 应用掩膜 masked_anomaly china_polygon.maskout( anomaly.longitude.values, anomaly.latitude.values, anomaly.values )掩膜技术要点确保输入数据的经纬度坐标与cnmaps采用的WGS84坐标系一致对于高分辨率数据掩膜操作可能消耗较大内存南海区域需要特殊处理以保证完整显示3. Cartopy高级可视化技术Cartopy作为专业地理可视化库其核心优势在于支持多种地图投影和地理要素的精确渲染。以下是一个配置完善的绘图函数import cartopy.crs as ccrs import cartopy.feature as cfeature import matplotlib.pyplot as plt def create_climate_map(data, lons, lats, title): fig plt.figure(figsize(15, 10)) proj ccrs.PlateCarree(central_longitude105) ax fig.add_subplot(111, projectionproj) # 设置地图范围 ax.set_extent([70, 140, 15, 55], crsproj) # 添加地理要素 ax.add_feature(cfeature.COASTLINE.with_scale(50m), linewidth0.8) ax.add_feature(cfeature.BORDERS.with_scale(50m), linestyle:, linewidth0.5) ax.add_feature(cfeature.LAKES.with_scale(50m), alpha0.5) # 绘制温度距平填色图 levels np.arange(-6, 6.5, 0.5) cf ax.contourf(lons, lats, data, levelslevels, cmapRdBu_r, extendboth, transformccrs.PlateCarree()) # 添加色标 cbar plt.colorbar(cf, axax, orientationhorizontal, pad0.05, aspect50, shrink0.8) cbar.set_label(Temperature Anomaly (°C), fontsize12) # 设置网格线 gl ax.gridlines(draw_labelsTrue, linewidth0.5, colorgray, alpha0.5) gl.top_labels False gl.right_labels False gl.xformatter LONGITUDE_FORMATTER gl.yformatter LATITUDE_FORMATTER plt.title(title, fontsize14, pad20) return fig, ax4. 南海小地图的集成技巧专业气象图通常需要在主图角落添加南海区域的小地图这既符合规范要求又能完整展示我国领土。实现这一功能的关键在于坐标系的统一和位置的精确控制def add_south_china_sea_inset(fig, main_ax, data, lons, lats): # 定义小地图位置和范围 inset_pos [0.72, 0.15, 0.2, 0.3] # [左, 下, 宽, 高] inset_extent [105, 125, 2, 25] # 经度范围, 纬度范围 # 创建小地图坐标系 inset_ax fig.add_axes(inset_pos, projectionccrs.PlateCarree()) # 绘制小地图内容 levels np.arange(-6, 6.5, 0.5) inset_ax.contourf(lons, lats, data, levelslevels, cmapRdBu_r, extendboth) # 添加小地图地理要素 inset_ax.add_feature(cfeature.COASTLINE.with_scale(50m)) inset_ax.add_feature(cfeature.BORDERS.with_scale(50m), linestyle:) inset_ax.set_extent(inset_extent) # 添加矩形框指示主图范围 main_rect plt.Rectangle((70, 15), 70, 40, fillFalse, colorred, linewidth1, transformccrs.PlateCarree()) inset_ax.add_patch(main_rect) # 添加小地图指示线 con ConnectionPatch( xyA(115, 15), xyB(115, 2), coordsAdata, coordsBdata, axesAmain_ax, axesBinset_ax, colorred, linewidth1) fig.add_artist(con)5. 构建自动化分析管道将上述步骤整合为自动化工作流是提升科研效率的关键。我们可以使用Python的argparse模块创建命令行接口配合配置文件实现灵活的参数控制import argparse import yaml from pathlib import Path def parse_arguments(): parser argparse.ArgumentParser() parser.add_argument(--config, typestr, requiredTrue, helpPath to configuration file) parser.add_argument(--output-dir, typestr, default./output, helpDirectory to save results) return parser.parse_args() def load_config(config_path): with open(config_path) as f: return yaml.safe_load(f) def main(): args parse_arguments() config load_config(args.config) # 确保输出目录存在 Path(args.output_dir).mkdir(exist_okTrue) # 执行数据处理流程 process_era5_data(config[data], args.output_dir) generate_plots(config[plot], args.output_dir) if __name__ __main__: main()配套的YAML配置文件示例data: era5: variables: [2m_temperature] years: [1950, 2023] months: [06, 07, 08] area: [55, 70, 0, 140] plot: colormap: RdBu_r levels: [-6, -4, -2, -1, -0.5, 0.5, 1, 2, 4, 6] map_extent: [70, 140, 15, 55] inset_extent: [105, 125, 2, 25]6. 性能优化与错误处理处理长时间序列、高分辨率气象数据时性能优化至关重要。以下是几个实用技巧内存优化技术使用xarray的chunk参数进行分块处理对于大规模计算考虑转换为Zarr格式存储适时清理中间变量释放内存# 分块处理示例 ds xr.open_dataset(large_file.nc, chunks{time: 10}) result ds.groupby(time.month).mean()常见错误处理网络请求失败时自动重试数据完整性检查图形渲染失败时的回退机制from tenacity import retry, stop_after_attempt, wait_exponential retry(stopstop_after_attempt(3), waitwait_exponential(multiplier1, min4, max10)) def download_era5_data(request, output_path): try: c cdsapi.Client() c.retrieve(reanalysis-era5-single-levels-monthly-means, request, output_path) except Exception as e: print(fDownload failed: {str(e)}) raise7. 扩展应用与进阶技巧掌握了基础工作流后可以进一步扩展分析维度多变量分析# 同时分析温度和降水距平 variables [2m_temperature, total_precipitation] multi_anomaly {var: calculate_anomaly(var) for var in variables}时间序列分析# 计算区域平均时间序列 region_avg t2m.sel(latitudeslice(25, 40), longitudeslice(100, 120)).mean(dim(latitude, longitude))自动化报告生成 结合Jupyter Notebook或R Markdown可以创建动态报告当数据更新时自动重新生成完整分析from nbformat import v4 as nbf def create_notebook(output_path): nb nbf.new_notebook() # 添加Markdown单元格 nb.cells.append(nbf.new_markdown_cell( # ERA5 Temperature Anomaly Analysis\n f*Generated on {datetime.now().strftime(%Y-%m-%d)}* )) # 添加代码单元格 nb.cells.append(nbf.new_code_cell( import xarray as xr\n ds xr.open_dataset(t2m_cn_jja_1950-2023.nc) )) # 保存Notebook with open(output_path, w) as f: nbf.write(nb, f)