
1. 气象可视化的核心工具选择做气象数据分析的朋友们都知道等值线图是我们最常用的可视化手段之一。但要把中国区域的等值线图画得专业规范可不是随便调个matplotlib就能搞定的。这里我强烈推荐Cartopycnmaps的组合方案这两个库简直就是为中国气象制图量身定做的。Cartopy作为专业的地理空间可视化库提供了丰富的地图投影和地理要素绘制功能。但它的内置中国地图数据存在众所周知的精度问题这时候cnmaps就派上大用场了。这个国产库不仅提供了精确到县级行政区的中国地图数据还能与Cartopy完美配合使用。我去年帮研究所做台风路径可视化时就踩过坑。当时直接用Cartopy画出来的国界线被导师一眼就看出问题后来换成cnmaps的数据才通过验收。所以特别提醒涉及中国地图的科研绘图数据源一定要慎选。2. 环境配置与数据准备2.1 基础环境搭建建议使用conda创建专属环境避免库版本冲突。实测以下版本组合最稳定conda create -n weather_plot python3.8 conda install -c conda-forge cartopy0.20.2 matplotlib3.5.1 pip install cnmaps xarray字体配置是很多人忽略的关键点。科研绘图要求中英文字体统一推荐这样设置import matplotlib.pyplot as plt plt.rcParams[font.family] Times New Roman # 英文用新罗马 plt.rcParams[font.sans-serif] [SimSun] # 中文用宋体2.2 气象数据获取与处理以ERA5数据为例下载后的NetCDF文件可以用xarray轻松处理import xarray as xr data xr.open_dataset(t2m_2023.nc) temp data[t2m].sel(latitudeslice(55,15), longitudeslice(70,140))计算温度距平时要注意时间维度处理。我常用的小技巧# 计算30年气候态平均 clim_mean temp.sel(timeslice(1991,2020)).mean(dimtime) # 计算2023年异常 anomaly temp.sel(time2023-06) - clim_mean3. 中国区域精确掩膜技术3.1 cnmaps的核心功能cnmaps的maskout功能是我最爱的特性它能完美解决跨边界数据展示问题from cnmaps import get_adm_maps china get_adm_maps(level国) # 获取国界数据 masked_data china.maskout(lons, lats, anomaly)这里有个实际项目中的经验当处理高分辨率数据时建议先对地理边界做缓冲处理避免出现锯齿状边缘from shapely.geometry import Polygon buffer_distance 0.2 # 单位是度 china_poly china.geometry.buffer(buffer_distance)3.2 特殊区域处理技巧对于南海诸岛区域的显示需要特别注意投影转换。我总结的最佳实践是import cartopy.crs as ccrs south_china_sea_proj ccrs.PlateCarree(central_longitude115) ax.set_extent([105, 125, 0, 25], crssouth_china_sea_proj)4. 专业等值线图绘制实战4.1 基础地图要素配置绘制符合气象规范的底图需要这些要素import cartopy.feature as cfeature ax.add_feature(cfeature.COASTLINE.with_scale(50m), linewidth0.8) ax.add_feature(cfeature.LAND, facecolorlightgray) ax.add_feature(cfeature.OCEAN, facecolorlightblue)经纬网格线的专业设置方式gl ax.gridlines(draw_labelsTrue, linestyle--, alpha0.5) gl.top_labels False # 关闭顶部标签 gl.right_labels False # 关闭右侧标签 gl.xformatter LONGITUDE_FORMATTER gl.yformatter LATITUDE_FORMATTER4.2 等值线填充进阶技巧推荐使用contourf的extend参数处理异常值levels np.arange(-10, 11, 2) cf ax.contourf(lons, lats, data, levelslevels, cmapRdBu_r, extendboth)色标设置的专业做法cbar plt.colorbar(cf, orientationhorizontal, pad0.05, aspect40) cbar.set_label(Temperature Anomaly (℃), fontsize12) cbar.ax.tick_params(labelsize10)5. 南海附属图的集成方案5.1 位置与比例控制通过add_axes精确控制主图与南海图的位置关系# 主图 ax_main fig.add_axes([0.1, 0.1, 0.6, 0.8]) # 南海图 ax_south fig.add_axes([0.68, 0.1, 0.25, 0.3])5.2 视觉一致性保持确保两图使用相同的色标范围vmin, vmax -10, 10 cf_main ax_main.contourf(..., vminvmin, vmaxvmax) cf_south ax_south.contourf(..., vminvmin, vmaxvmax)6. 出版级图像输出设置6.1 分辨率与格式选择期刊投稿的推荐配置plt.savefig(output.tif, dpi600, bbox_inchestight, formattiff, pil_kwargs{compression: tiff_lzw})6.2 常见问题排查遇到图像边缘被裁剪时可以尝试plt.savefig(..., pad_inches0.1) # 增加边距字体丢失问题时转为PDF格式通常更可靠plt.savefig(output.pdf, formatpdf)7. 完整代码案例解析这里分享一个经过项目验证的完整脚本框架# 导入部分 import numpy as np import xarray as xr import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature from cnmaps import get_adm_maps # 数据准备 data xr.open_dataset(input.nc) anomaly calculate_anomaly(data) # 自定义异常计算函数 # 地图配置 proj ccrs.PlateCarree() fig plt.figure(figsize(12,8)) ax fig.add_subplot(111, projectionproj) # 数据掩膜 china get_adm_maps(level国) masked_data china.maskout(data.lon, data.lat, anomaly) # 绘图核心 levels np.linspace(-10,10,21) cf ax.contourf(data.lon, data.lat, masked_data, levelslevels, cmapRdBu_r, extendboth) # 地图装饰 add_map_features(ax) # 自定义地图要素添加函数 setup_colorbar(fig, cf) # 自定义色标设置函数 # 输出 plt.savefig(final_output.tif, dpi600, bbox_inchestight)在实际项目中我会把常用功能封装成工具函数。比如地图要素添加可以写成def add_standard_features(ax): 添加标准地图要素 ax.add_feature(cfeature.COASTLINE.with_scale(50m)) ax.add_feature(cfeature.BORDERS.with_scale(50m), linestyle:) setup_gridlines(ax) # 另一个自定义函数8. 性能优化与常见问题处理全国高分辨率数据时内存管理很关键。我的经验是使用dask进行分块处理先做区域裁剪再计算适当降低输出分辨率图形渲染慢的问题可以尝试plt.rcParams[path.simplify] True plt.rcParams[path.simplify_threshold] 0.1字体显示异常的解决方案确认字体文件路径正确清除matplotlib缓存尝试使用绝对路径指定字体中国地图精确绘制是个需要特别认真对待的技术活。记得去年有个合作项目就因为地图边界的一个小偏差差点导致整个研究被退回修改。后来我们建立了严格的地图审核流程所有可视化输出都要经过三遍检查数据源检查、渲染效果检查、最终输出检查。