news 2026/6/3 22:25:42

用Python和Cartopy画专业气象图:从ERA5数据到带南海小地图的温度距平图(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用Python和Cartopy画专业气象图:从ERA5数据到带南海小地图的温度距平图(附完整代码)

Python气象可视化实战:基于Cartopy的ERA5温度距平图绘制全流程

气象数据可视化是科研工作中不可或缺的一环。当我们需要分析气候异常或展示区域温度变化时,一张专业的地图往往胜过千言万语。本文将手把手带你用Python实现从ERA5数据读取到专业温度距平图生成的完整流程,重点解决Cartopy绘制中国地图时的常见痛点。

1. 环境配置与数据准备

工欲善其事,必先利其器。在开始绘图前,我们需要搭建一个稳定的Python环境并获取必要的ERA5数据。

1.1 安装必要的Python库

推荐使用conda创建虚拟环境,避免依赖冲突:

conda create -n weather_plot python=3.8 conda activate weather_plot conda install -c conda-forge cartopy xarray matplotlib numpy cnmaps

关键库的作用说明:

  • Cartopy:专业地理信息可视化库
  • xarray:处理NetCDF格式的ERA5数据
  • cnmaps:中国行政区划边界数据
  • Matplotlib:基础绘图引擎

1.2 获取ERA5数据

ERA5是ECMWF提供的第五代全球大气再分析数据,可通过Copernicus Climate Data Store下载:

import cdsapi c = cdsapi.Client() c.retrieve( 'reanalysis-era5-single-levels-monthly-means', { 'product_type': 'monthly_averaged_reanalysis', 'variable': '2m_temperature', 'year': ['2020'], 'month': ['01', '02', '03'], 'time': '00:00', 'format': 'netcdf', }, 'era5_t2m_monthly.nc')

提示:完整下载多年数据可能需要较长时间,建议分批下载后使用xarray合并

2. 数据处理与距平计算

原始数据需要经过处理才能揭示温度异常信号。这一节将展示如何计算相对于气候平均态的距平值。

2.1 数据读取与预处理

使用xarray高效处理NetCDF数据:

import xarray as xr # 读取数据 ds = xr.open_dataset('era5_t2m_monthly.nc') t2m = ds['t2m'] # 获取2米温度变量 # 区域裁剪(中国及周边) t2m_cn = t2m.sel(longitude=slice(70, 140), latitude=slice(55, 0))

2.2 计算气候态与距平

气候态通常取30年平均,这里以2000-2020年为例:

# 假设已加载多年数据 t2m_clim = t2m_cn.sel(time=slice('2000-01-01', '2020-12-01')) monthly_clim = t2m_clim.groupby('time.month').mean(dim='time') # 计算2023年6月距平 t2m_june_2023 = t2m_cn.sel(time='2023-06-01') anomaly = t2m_june_2023 - monthly_clim.sel(month=6)

2.3 中国区域掩膜处理

使用cnmaps精确提取中国范围内的数据:

from cnmaps import get_adm_maps china_polygon = get_adm_maps(level='国', only_polygon=True) masked_anomaly = china_polygon.maskout(anomaly.longitude, anomaly.latitude, anomaly)

3. 基础地图绘制

掌握了数据处理方法后,我们开始构建地图绘制的核心框架。

3.1 创建地图投影

Cartopy支持多种投影方式,中国区域推荐使用PlateCarree:

import cartopy.crs as ccrs import matplotlib.pyplot as plt proj = ccrs.PlateCarree(central_longitude=105) fig = plt.figure(figsize=(12, 8)) ax = fig.add_subplot(111, projection=proj)

3.2 添加地理要素

增强地图的专业性和可读性:

import cartopy.feature as cfeature # 基础地理要素 ax.add_feature(cfeature.COASTLINE.with_scale('50m'), linewidth=0.8) ax.add_feature(cfeature.LAND.with_scale('50m'), facecolor='#f5f5f5') ax.add_feature(cfeature.OCEAN.with_scale('50m'), facecolor='#d9edf7') # 使用cnmaps添加精确国界 from cnmaps import draw_maps draw_maps(ax, color='k', linewidth=1)

3.3 配置网格与刻度

专业地图需要清晰的坐标参考:

from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter gl = ax.gridlines(draw_labels=True, linewidth=0.5, color='gray', alpha=0.5, linestyle='--') gl.top_labels = False gl.right_labels = False gl.xformatter = LongitudeFormatter() gl.yformatter = LatitudeFormatter() ax.set_xticks(range(70, 141, 10), crs=proj) ax.set_yticks(range(0, 56, 10), crs=proj) ax.set_extent([70, 140, 0, 55], crs=proj)

4. 高级可视化技巧

基础地图完成后,我们需要添加温度距平数据和专业修饰元素。

4.1 等值线填充

使用contourf展示温度距平分布:

import numpy as np # 设置色标范围 levels = np.arange(-6, 6.5, 0.5) cf = ax.contourf(anomaly.longitude, anomaly.latitude, masked_anomaly, levels=levels, cmap='RdBu_r', extend='both') # 添加等值线 cs = ax.contour(anomaly.longitude, anomaly.latitude, masked_anomaly, levels=levels[::2], colors='k', linewidths=0.5) ax.clabel(cs, fmt='%1.1f', fontsize=8)

4.2 颜色条设置

专业颜色条需要精确控制位置和样式:

cbar = plt.colorbar(cf, orientation='horizontal', pad=0.05, aspect=40, shrink=0.8) cbar.set_label('Temperature Anomaly (°C)', fontsize=12) cbar.ax.tick_params(labelsize=10)

4.3 南海小地图实现

中国地图必须包含南海诸岛,这是科研绘图的规范要求:

# 主图缩小留出空间 ax.set_position([0.1, 0.1, 0.8, 0.8]) # 添加南海小地图 ax_inset = fig.add_axes([0.72, 0.15, 0.2, 0.2], projection=proj) ax_inset.add_feature(cfeature.COASTLINE.with_scale('50m')) draw_maps(ax_inset, color='k', linewidth=0.5) ax_inset.set_extent([105, 125, 0, 25], crs=proj) # 在小地图上绘制同样的数据 cf_inset = ax_inset.contourf(anomaly.longitude, anomaly.latitude, masked_anomaly, levels=levels, cmap='RdBu_r', extend='both') # 添加九段线 from cnmaps import draw_nine_lines draw_nine_lines(ax_inset, color='red', linewidth=1)

5. 样式优化与输出

最后的修饰步骤决定成图的专业程度。

5.1 字体与文本设置

中英混排时的字体配置:

import matplotlib as mpl mpl.rcParams['font.family'] = 'Arial' mpl.rcParams['axes.unicode_minus'] = False # 添加标题 ax.set_title('2023年6月中国地表温度距平分布', fontsize=14, pad=20) # 添加数据来源说明 plt.text(0.5, -0.1, '数据来源: ERA5 monthly averaged reanalysis', transform=ax.transAxes, ha='center', fontsize=9)

5.2 导出高分辨率图像

适合期刊投稿的参数设置:

plt.savefig('temperature_anomaly_china.png', dpi=600, bbox_inches='tight', facecolor='white')

5.3 完整代码结构

将所有步骤模块化为函数,方便复用:

def plot_china_anomaly(anomaly_data, title=None, output_file=None): """绘制中国区域温度距平图 参数: anomaly_data (xarray.DataArray): 包含经纬度坐标的距平数据 title (str): 图标题 output_file (str): 输出文件路径 """ # 初始化图形 proj = ccrs.PlateCarree(central_longitude=105) fig = plt.figure(figsize=(12, 8)) ax = fig.add_subplot(111, projection=proj) # 绘制地图基础要素 ax.add_feature(cfeature.COASTLINE.with_scale('50m')) draw_maps(ax, color='k', linewidth=1) # 绘制距平数据 levels = np.arange(-6, 6.5, 0.5) cf = ax.contourf(anomaly_data.longitude, anomaly_data.latitude, anomaly_data, levels=levels, cmap='RdBu_r', extend='both') # 添加颜色条 cbar = plt.colorbar(cf, orientation='horizontal', pad=0.05) cbar.set_label('Temperature Anomaly (°C)') # 添加南海小地图 add_south_china_sea_inset(fig, anomaly_data, levels) if title: ax.set_title(title) if output_file: plt.savefig(output_file, dpi=600, bbox_inches='tight') return fig, ax def add_south_china_sea_inset(fig, data, levels): """添加南海小地图""" ax_inset = fig.add_axes([0.72, 0.15, 0.2, 0.2], projection=ccrs.PlateCarree()) ax_inset.set_extent([105, 125, 0, 25]) ax_inset.add_feature(cfeature.COASTLINE.with_scale('50m')) draw_maps(ax_inset, color='k', linewidth=0.5) draw_nine_lines(ax_inset, color='red', linewidth=1) cf_inset = ax_inset.contourf(data.longitude, data.latitude, data, levels=levels, cmap='RdBu_r')
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/3 22:23:03

okbiye AI PPT 生成工具,一站式搞定毕业论文答辩演示文稿

okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPTAI PPT制作 - Okbiye智能写作https://www.okbiye.com/ppt 引言:答辩季 PPT 制作的普遍痛点 每到毕业答辩筹备阶段,不少应届学子都陷入答辩 PPT 制作的难题。好不容易写完几万字…

作者头像 李华
网站建设 2026/6/3 22:18:12

【linux学习】Linux 软硬链接深度解析:从 inode 到目录硬链接的那些坑

大家好,我是程序员小青蛙,今天介绍软硬链接。在 Linux 系统中,软硬链接是文件系统最基础也最容易混淆的概念之一。很多初学者会问:硬链接和软链接到底有什么区别?为什么删除原文件后有的链接还能用,有的就失…

作者头像 李华
网站建设 2026/6/3 22:18:10

Telephone:Mac用户必备的终极开源SIP电话解决方案指南

Telephone:Mac用户必备的终极开源SIP电话解决方案指南 【免费下载链接】Telephone SIP softphone for Mac 项目地址: https://gitcode.com/gh_mirrors/te/Telephone Telephone是一款专为macOS用户设计的免费开源SIP软电话应用程序,让你能够在苹果…

作者头像 李华
网站建设 2026/6/3 22:11:28

Cursor免费试用终极重置指南:三步快速解除AI编程助手限制

Cursor免费试用终极重置指南:三步快速解除AI编程助手限制 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Your request has been blocked as our system has detected suspicious activity / Youve reached your trial request limi…

作者头像 李华