1. 从“折磨”到“解脱”:我与Cartopy极地投影的爱恨情仇
大家好,我是你们的老朋友,一个在气象数据可视化领域摸爬滚打了十多年的技术老兵。今天想和大家掏心窝子聊聊一个让我又爱又恨的工具——Cartopy,特别是它在处理极地投影时那些让人抓狂的“坑”。如果你也曾经为了在北极或南极画一张漂亮的风场图,结果等值线扭曲得像抽象画,风矢量箭头挤成一团或者干脆消失一半,那你一定懂我的感受。在过去很长一段时间里,Cartopy的极地投影功能就像个脾气古怪的艺术家,时好时坏,尤其是20.x版本,多边形扭曲和风场分布不均的问题几乎成了标配。我甚至一度被逼得转投其他绘图库的怀抱,那种无奈,相信很多同行都深有体会。
但转机来了!Cartopy 21.0版本的发布,对我来说简直像一场及时雨。官方终于对极地投影的核心顽疾下了狠手。这次更新不是修修补补,而是针对底层投影算法和数据处理逻辑进行了重要调整。我抱着试试看的心态升级后,重新跑了一遍之前让我头疼的北极10米风场可视化代码,效果让我眼前一亮——那些诡异的扭曲多边形消失了,风场箭头均匀、清晰地分布在极地范围内,整个出图流程顺畅得让人感动。所以,我迫不及待地想通过这篇文章,把我升级和适配新版本的经验、踩过的坑以及最终的效果对比,毫无保留地分享给大家。无论你是刚入门气象绘图的新手,还是被旧版Bug困扰已久的老鸟,相信这篇实战指南都能让你少走弯路,快速享受到新版Cartopy带来的稳定与高效。
2. 核心痛点:Cartopy 20.x极地投影的“经典”Bug全解析
在深入21.0版本的解决方案之前,我们有必要彻底搞清楚老版本到底哪里出了问题。知其然,更要知其所以然,这样我们才能更好地理解新版本的改进意义,并在未来遇到类似问题时心中有数。根据我多年的实战经验,以及社区里广泛的吐槽,Cartopy 20.x在极地投影上主要有两大“罪状”,它们常常结伴出现,让你的可视化结果惨不忍睹。
### 2.1 多边形扭曲与“飞线”问题
这是最直观、也最令人崩溃的问题。当你使用contourf或contour绘制等值线填充图时,在极地投影的边缘,特别是靠近地图边界(比如北纬60度圈附近)或者日期变更线(经度180°附近)的区域,本应平滑闭合的等值线会突然扭曲、断裂,甚至产生一些完全不属于数据本身的、横跨整个地图的怪异多边形,业内戏称为“飞线”。这不仅仅是美观问题,它严重扭曲了数据的空间分布信息,导致科学分析结论可能出现偏差。
其根本原因,在于旧版本Cartopy在处理跨越地图投影边界的多边形时,坐标转换和裁剪逻辑存在缺陷。当数据网格的边界线与地图投影的边界(如极地投影的圆形边界)相交时,库在判断哪些部分应该显示、哪些应该被裁剪时容易出错,错误地将一些本应被“切掉”的多边形片段连接了起来,从而生成了视觉上的扭曲图形。这个问题在绘制高分辨率数据或者等值线梯度较大的区域时尤为明显。
### 2.2 风场矢量分布不均与畸变
对于风场、流场这类矢量数据的可视化,问题更加棘手。使用quiver或barbs绘制箭头时,你经常会发现:在极地中心区域,箭头可能过于密集,挤成一团根本看不清;而在边缘区域,箭头又稀疏得可怜,甚至完全缺失。更糟糕的是,箭头的方向和长度也可能出现畸变,不能真实反映风场的矢量信息。
这个问题背后有多个因素交织。首先,投影变换的失真:极地投影(如NorthPolarStereo)是一种保角投影,但在从经纬度坐标(PlateCarree)转换到极地投影坐标的过程中,尤其是在高纬度地区,距离和方向的变形会被放大。旧版本在计算箭头位置(regrid_shape参数影响)和进行矢量旋转时,算法不够鲁棒,导致箭头定位不准。其次,数据网格与绘图网格的匹配:如果你的风场数据是规则经纬度网格,而quiver在绘图时默认基于这个经纬度网格在投影平面上放置箭头。在极地投影下,经线汇聚于极点,导致固定经纬度间隔的网格点在投影平面上分布极不均匀(极点附近极密,外围较疏)。旧版Cartopy没有很好地处理这种非线性分布,直接导致了箭头疏密不均。
为了让大家有更直观的感受,我翻出了以前用Cartopy 20.3绘制的一张北极500hPa风场和位势高度场的图。大家可以想象一下:等值线在格陵兰岛东侧莫名其妙地扭成了麻花,而在白令海峡附近出现了跨越整个太平洋的“幽灵”等高线;风箭头在加拿大北极群岛区域密集得像个毛线团,而在西伯利亚沿岸却稀稀拉拉。这样的图,别说用于分析了,就是拿给导师或者同事看,自己都觉得脸上无光。正是这些痛点,催生了社区里各种各样的“魔改”和临时解决方案,也最终推动了Cartopy核心开发团队在21.0版本中集中火力解决这些问题。
3. 升级之路:手把手安装Cartopy 21.0
好了,吐槽完旧版的不是,我们马上进入正题,看看如何拥抱新版。Cartopy 21.0的安装过程,和以往略有不同,如果你直接用conda install cartopy,很可能装上的还是20.x的老版本。别担心,跟着我的步骤走,保证你能稳稳上车。
### 3.1 为何推荐“手动”安装?
目前,Cartopy 21.0在默认的conda通道(如defaults)中可能还不是最新版本。conda-forge通道的更新通常会更快更及时,但有时也会因为依赖关系解析而滞后。为了确保我们百分百用上修复了极地Bug的21.0版,最稳妥的方式是直接从官方发布页面下载预编译的.tar.bz2包进行本地安装。这种方法能绕过复杂的依赖解析,直装目标版本。我实测在Windows和Linux系统下都非常顺利。
### 3.2 分步安装指南
首先,访问Cartopy在GitHub的发布页面,或者直接通过PyPI查找。这里我以在Windows系统上,Python 3.9环境为例:
-
卸载旧版本:打开你的Anaconda Prompt(或者终端),先清理掉可能存在的旧版本。这一步很重要,避免冲突。
conda remove cartopy --force这个
--force参数会强制移除cartopy包,但会保留其依赖(如Shapely, PROJ等),这样我们重装时会更快捷。 -
下载安装包:前往Cartopy的PyPI页面或通过
pip download命令,找到对应你操作系统和Python版本的cartopy-0.21.0-cp39-cp39-win_amd64.whl文件(如果是Linux,则是manylinux标签的whl文件)。例如,对于Windows 64位 + Python 3.9,文件可能名为cartopy-0.21.0-cp39-cp39-win_amd64.whl。直接下载到本地一个你记得住的路径,比如D:\Downloads\。 -
本地安装:在Anaconda Prompt中,切换到安装包所在的目录,然后使用
pip进行安装。pip在处理本地whl文件时非常高效。cd D:\Downloads pip install cartopy-0.21.0-cp39-cp39-win_amd64.whl如果下载的是
.tar.bz2格式的conda包,你也可以使用conda install命令:conda install /path/to/cartopy-0.21.0-py39hxxxx.tar.bz2 -
验证安装:安装完成后,启动Python,导入cartopy并打印版本号,确认是否成功升级。
import cartopy print(cartopy.__version__) # 应该输出 '0.21.0'
### 3.3 可能遇到的依赖问题及解决
有时候,安装新版本Cartopy可能会提示缺少某些底层库,比如GEOS、PROJ版本过低。别慌,这都是小问题。
- PROJ版本问题:Cartopy 21.0可能需要PROJ 9.x或更高版本。你可以通过conda-forge通道单独升级PROJ:
conda install -c conda-forge proj=9 - GEOS问题:类似地,如果GEOS版本不匹配,也可以单独升级:
conda install -c conda-forge geos - 万能解法:如果上述方法麻烦,我推荐一个“釜底抽薪”的办法:创建一个全新的conda环境,专门用于气象可视化。在这个新环境里,直接通过conda-forge安装Cartopy,这样conda会自动解决所有依赖。
这个新环境干净、独立,不会干扰你其他项目,非常推荐。conda create -n cartopy21 python=3.9 conda activate cartopy21 conda install -c conda-forge cartopy=0.21.0 matplotlib netcdf4 xarray
安装完毕,我们的“武器”就升级完成了。接下来,就是检验它威力的时候了。
4. 实战:用Cartopy 21.0绘制北极10米风场
理论说再多,不如一行代码。我们直接上干货,用ERA5再分析数据的北极10米风场(U10, V10)作为例子,看看新版Cartopy下,代码到底怎么写,效果到底有多大的提升。我会把完整的、可运行的代码拆解给你看,并解释每一个关键步骤和参数的意义。
### 4.1 数据准备与读取
首先,你需要准备好NetCDF格式的风场数据。这里我假设你已经从ECMWF等渠道下载了ERA5数据,文件里包含了u10(纬向风)、v10(经向风)变量,以及latitude, longitude坐标。我们使用xarray库来读取,它比netCDF4更友好,处理多维数据就像操作字典一样简单。
import xarray as xr
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
# 1. 读取数据
file_path = 'your_era5_10m_wind.nc' # 替换为你的文件路径
ds = xr.open_dataset(file_path)
# 2. 提取变量。假设数据有多个时间步,我们取第一个时刻(例如,索引0)
u10 = ds['u10'].isel(time=0) # 纬向风,单位通常是 m/s
v10 = ds['v10'].isel(time=0) # 经向风
lat = ds['latitude']
lon = ds['longitude']
# 3. 计算风速大小(标量),用于后续着色
wind_speed = np.sqrt(u10**2 + v10**2)
# 4. 确定绘图区域:北极地区,例如北纬60度以上
lat_min, lat_max = 60, 90
lon_min, lon_max = -180, 180
# 对数据进行区域裁剪,减少不必要的计算和绘图量
u10_sub = u10.sel(latitude=slice(lat_max, lat_min), longitude=slice(lon_min, lon_max))
v10_sub = v10.sel(latitude=slice(lat_max, lat_min), longitude=slice(lon_min, lon_max))
wind_speed_sub = wind_speed.sel(latitude=slice(lat_max, lat_min), longitude=slice(lon_min, lon_max))
lat_sub = lat.sel(latitude=slice(lat_max, lat_min))
lon_sub = lon.sel(longitude=slice(lon_min, lon_max))
### 4.2 地图投影与图形初始化
接下来是设置地图投影。对于北极,我们自然选择NorthPolarStereo(北半球极射赤面投影)。central_longitude参数可以设置地图的中心经线,通常设为0度或某个有意义的经度。
# 设置图形和投影
fig = plt.figure(figsize=(12, 10)) # 创建一个图形窗口
# 创建地图轴,指定为极地投影。central_longitude=0意味着0度经线在正下方。
proj = ccrs.NorthPolarStereo(central_longitude=0)
ax = fig.add_subplot(1, 1, 1, projection=proj)
# 设置地图的显示范围,[左经,右经,下纬,上纬],注意这里的crs参数必须指定为数据的原始坐标系统(通常是PlateCarree)
ax.set_extent([lon_min, lon_max, lat_min, lat_max], crs=ccrs.PlateCarree())
# 添加地理特征:海岸线,分辨率可以选择'110m', '50m', '10m',越精细渲染越慢
ax.add_feature(cfeature.COASTLINE.with_scale('110m'), linewidth=0.8)
# 也可以添加陆地、海洋的填充色,让地图更美观
ax.add_feature(cfeature.LAND, facecolor='lightgray', alpha=0.5)
ax.add_feature(cfeature.OCEAN, facecolor='lightblue', alpha=0.3)
### 4.3 绘制风场矢量的关键技巧
这是新版Cartopy大显身手的地方。我们使用quiver函数来绘制风箭头。有几个参数至关重要,直接决定了可视化效果的好坏。
# 将经纬度网格转换为numpy数组,这是quiver函数需要的格式
lon_grid, lat_grid = np.meshgrid(lon_sub.values, lat_sub.values)
u_data = u10_sub.values
v_data = v10_sub.values
speed_data = wind_speed_sub.values
# 关键步骤:绘制风场矢量图
# transform=ccrs.PlateCarree() 告诉Cartopy,我们提供的(u, v)风分量是在经纬度坐标系下的。
# regrid_shape 是21.0版本下优化极地绘图的利器!它先将数据在投影空间内重采样到指定网格密度,再绘制。
# 这里设置为30,意味着在投影平面上将数据重采样到一个30x30的规则网格上,再画箭头。这能有效解决箭头疏密不均。
# scale 和 scale_units 控制箭头长度。'xy'表示在投影平面的x, y方向等比例缩放,通常与regrid_shape配合较好。
# pivot='tail' 让箭尾位于数据点,看起来更自然。
# width 控制箭杆的粗细。
quiver = ax.quiver(lon_grid, lat_grid, u_data, v_data, speed_data,
transform=ccrs.PlateCarree(),
regrid_shape=30,
scale=200, # 这个值可能需要根据你的风速范围调整,值越大箭头越短
scale_units='xy',
pivot='tail',
width=0.003,
cmap='plasma') # 用风速大小给箭头上色,使用'plasma'色图
# 添加色标 (colorbar),显示风速大小
cbar = plt.colorbar(quiver, ax=ax, orientation='vertical', pad=0.05, shrink=0.8)
cbar.set_label('10m Wind Speed (m/s)', fontsize=12)
# 添加经纬度网格线,并显示标签
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,
linewidth=0.5, color='gray', alpha=0.5, linestyle='--')
gl.top_labels = False # 不显示顶部标签
gl.right_labels = False # 不显示右侧标签
gl.xformatter = LONGITUDE_FORMATTER
gl.yformatter = LATITUDE_FORMATTER
gl.xlabel_style = {'size': 10}
gl.ylabel_style = {'size': 10}
# 添加图题
ax.set_title('ERA5 10m Wind over Arctic Region\n(Cartopy 21.0 - North Polar Stereo)', fontsize=14, pad=20)
plt.tight_layout()
plt.show()
### 4.4 代码核心要点解读
transform=ccrs.PlateCarree():这是最容易出错,也最重要的参数之一。它明确告知Cartopy,你提供的风矢量数据(u_data,v_data)其方向和大小是定义在经纬度坐标系下的。Cartopy在绘制时,会先根据这个信息,结合目标投影(NorthPolarStereo),将矢量正确地转换到投影平面上。如果你错误地设置成transform=proj,而你的风数据本身是经纬度坐标的,那么箭头方向就会完全错乱。regrid_shape=30:这是21.0版本解决风场分布不均的核心参数。它不再直接在你原始的数据网格点(可能成千上万个)上画箭头,而是先将矢量数据在目标投影空间内,重采样到一个更稀疏、更均匀的规则网格(这里是30x30)上,然后在这个新网格上绘制箭头。这极大地改善了极地中心区域箭头过密、边缘过疏的问题,让可视化效果更加清晰、均衡。你可以根据数据分辨率和图形大小调整这个值(比如20, 25, 35等)。scale和pivot:scale值需要反复调试。风速大,scale值也要相应调大,否则箭头会太长、重叠。pivot='tail'让箭头从数据点“长”出来,比默认的'mid'(箭头中点位于数据点)在表现风场走向时更直观。
运行这段代码,你应该能得到一张清晰、美观的北极风场图。风箭头从北极点向外均匀辐射,颜色梯度平滑地反映了风速大小,海岸线轮廓准确,再也没有了那些恼人的扭曲和缺失。
5. 新旧版本效果对比:眼见为实的提升
光说不练假把式,我们直接来对比。为了公平起见,我使用同一套ERA5数据、完全相同的绘图区域和风格设置,分别用Cartopy 20.3(或更早的Bug版本)和21.0版本生成风场图。
### 5.1 视觉对比:从“灾难”到“专业”
在旧版本(左图)中,你可以清晰地看到我之前提到的所有问题:
- 多边形扭曲:在格陵兰岛以东、巴伦支海区域,等值线填充(如果绘制的话)会出现不规则的锯齿状边缘和断裂。
- 风场畸变:箭头在靠近极点(80°N以上)的区域堆积得非常密集,几乎无法分辨单个箭头;而在60°N-70°N的环状带上,箭头又显得过于稀疏。部分区域(如东西伯利亚海上空)的箭头方向看起来有些“歪”,与周围风场不协调。
- 投影边界异常:在地图最外圈的圆形边界附近,偶尔会有箭头被不正确地裁剪掉一半。
而在新版本(右图)中,这些问题得到了显著改善甚至根除:
- 画面干净整洁:无论是等值线还是风箭头,都严格限制在极地投影的圆形区域内,边界平滑,无任何“飞线”或扭曲多边形。
- 风场分布均匀:得益于
regrid_shape参数,箭头在整个区域内分布得更加合理、均匀。极心附近不再是一团乱麻,边缘地带也不再空旷,每个箭头都能清晰可辨。 - 矢量方向准确:箭头方向与背景流场(如果叠加了等高线)吻合得更好,真实反映了风场的切向和径向分量。
这种视觉上的提升是颠覆性的。它意味着我们终于可以信任Cartopy输出的极地可视化结果,能够放心地将其用于科研论文、报告或业务产品中。
### 5.2 性能与稳定性
除了视觉效果,21.0版本在稳定性和性能上也有提升。在绘制高分辨率全球数据或长时间序列动画时,旧版本偶尔会因内存管理或坐标转换错误而崩溃。新版本底层算法的优化,使得处理大型极地数据集更加稳健。我测试过一个包含全球0.25度分辨率风场的数据集,在21.0下绘制北极区域,不仅出图更快,而且内存占用也更平稳。
### 5.3 给仍然被困在旧版本用户的建议
如果你因为项目依赖或环境暂时无法升级到21.0,但又急需解决极地绘图问题,社区里也有一些临时方案。最常见的是在绘制前,手动对数据进行“裁剪”和“重投影预处理”。例如,你可以先将数据从经纬度网格插值到极地投影下的直角坐标网格,然后再用这个新网格的数据进行绘图。但这需要额外的计算步骤,代码更复杂,且效果往往不如新版内置的优化。因此,我强烈建议将升级Cartopy作为首选解决方案。它不仅仅修复了Bug,更代表了一种更现代、更可靠的数据可视化工作流程。
6. 不止于风场:其他极地可视化场景的适配
Cartopy 21.0的修复是全局性的,受益的绝不仅仅是风场quiver绘图。几乎所有在极地投影下可能出问题的绘图函数都得到了改善。这意味着你可以更自信地将它应用到更广泛的气象海洋可视化任务中。
### 6.1 等值线与填充图(contour, contourf)
之前等值线扭曲的噩梦一去不复返了。现在你可以像在中低纬度地区一样,轻松地绘制北极的海平面气压场、温度场、降水场的等值线图。contour和contourf函数现在能正确处理极地投影边界,生成平滑、闭合的等值线。一个实用的技巧是,对于填充图contourf,你可以结合set_boundary方法为极地地图添加一个圆形边界,让图形看起来更完整。
# 示例:绘制北极海平面气压等值线填充图
import numpy as np
import matplotlib.path as mpath
# ... 数据读取部分省略,假设已有 slp (海平面气压) 数据 ...
# 创建圆形边界,使地图呈现完美的圆形
theta = np.linspace(0, 2*np.pi, 100)
center, radius = [0.5, 0.5], 0.5
verts = np.vstack([np.sin(theta), np.cos(theta)]).T
circle = mpath.Path(verts * radius + center)
ax.set_boundary(circle, transform=ax.transAxes)
# 绘制等值线填充
cf = ax.contourf(lon_grid, lat_grid, slp_data, levels=20, cmap='RdBu_r',
transform=ccrs.PlateCarree(), extend='both')
plt.colorbar(cf, ax=ax, label='Sea Level Pressure (hPa)')
### 6.2 散点图与轨迹图
如果你有北极观测站点的数据(如浮标、气象站),或者想绘制气团轨迹,散点图scatter和轨迹图plot现在也能完美工作。只需确保提供给scatter的transform参数正确(通常是ccrs.PlateCarree()),点就会准确地落在对应的经纬度位置上,即使是在极点附近。
### 6.3 矢量流线图(streamplot)
streamplot(流线)是展示流场(如海洋表层流、高空急流)的另一种强大工具。在旧版Cartopy中,在极地使用streamplot几乎肯定会失败或产生怪异图形。在21.0中,其稳定性大大增强。不过需要注意的是,streamplot本身计算量较大,在极地高纬度地区由于投影变形,可能需要更精细的网格和参数调试才能得到平滑的流线。建议先在小区域或低分辨率数据上测试。
### 6.4 结合Xarray的高级操作
现代气象数据处理离不开xarray。Cartopy与xarray的集成非常友好。你可以直接使用xarray.DataArray的plot方法,并通过subplot_kw参数传入Cartopy的投影,实现一行代码快速出图。虽然对于极地等复杂场景,手动控制ax.contourf等函数仍然更灵活,但对于快速查看数据,xarray的内置绘图功能配合新版Cartopy,在极地也能给出可接受的结果。
# 使用xarray快速绘制北极表面温度
ds_t2m = xr.open_dataset('arctic_t2m.nc')
t2m = ds_t2m['t2m'].isel(time=0)
# 选择北极区域
t2m_arctic = t2m.sel(latitude=slice(90, 60))
# 一行代码出图,指定极地投影
t2m_arctic.plot(subplot_kws=dict(projection=ccrs.NorthPolarStereo()),
transform=ccrs.PlateCarree(),
cbar_kwargs={'label': '2m Temperature (K)'})
plt.gca().coastlines() # 添加海岸线
plt.title('Arctic 2m Temperature')
plt.show()
7. 避坑指南与最佳实践
升级到新版本固然爽,但在实际使用中,依然有一些细节需要注意,才能让你的极地可视化既漂亮又科学。下面是我总结的几个关键要点和常见陷阱。
### 7.1 数据预处理:质量的关键
- 处理缺测值:NetCDF数据中常用
NaN或特定的_FillValue表示缺测。在计算风速(np.sqrt(u**2 + v**2))或绘图前,务必处理好这些值。否则,NaN会在计算中传播,导致绘图失败或出现空白区域。可以使用xarray的.where()或np.nan_to_num进行处理。 - 经纬度单调性:确保你的经度(longitude)坐标是单调递增的,并且范围是连续的(例如-180到180,或者0到360)。对于全球数据,如果经度范围是0-360,而你要绘制北极图(通常希望0度经线在下方),可能需要对数据进行“滚动”操作(
xarray的roll方法)。 - 选择合适的数据切片:绘制北极时,没必要加载全球数据。像我们之前做的那样,用
slice方法提前截取北纬60度或70度以上的数据,可以大幅提升读取和绘图效率。
### 7.2 投影与坐标转换:永远要清醒
这是Cartopy绘图,尤其是极地绘图的核心原则,必须时刻牢记:
- 数据坐标:你的原始数据(
lon,lat,u,v,temp等)所在的坐标系。对于绝大多数再分析数据和模式输出,这个坐标系就是地理经纬度坐标系,在Cartopy中对应ccrs.PlateCarree()。这是transform参数最常设置的值。 - 地图投影:你最终想要呈现图形所用的坐标系,比如
ccrs.NorthPolarStereo()。这是在创建ax时通过projection参数指定的。 - 黄金法则:当你通过
ax.contourf,ax.quiver,ax.scatter等函数向地图上添加数据时,必须通过transform参数明确告诉Cartopy你的数据坐标是什么。Cartopy会自动负责从数据坐标到地图投影坐标的转换。永远不要假设你的数据已经在地图投影坐标里了,除非你手动做过转换。
### 7.3 图形美化与输出
- 调整
regrid_shape:这是控制极地风场图美观度的最重要参数。值越小,箭头越稀疏,图形越简洁,但可能丢失细节;值越大,细节越多,但可能恢复拥挤。对于0.25度左右的数据,25-35是一个不错的起点。多试几次,找到清晰度和细节的平衡点。 - 色图选择:科学可视化推荐使用感知均匀的色图,如
viridis,plasma,cividis等,避免使用jet这类误导性的色图。Cartopy兼容Matplotlib的所有色图。 - 添加指北针和比例尺:虽然极地投影的中心就是北,但添加一个指北针仍是好习惯。可以使用
ax.annotate简单添加。极地投影的比例尺是变化的,添加比例尺需要小心,通常可以省略,或用文字说明投影中心附近的比例。 - 输出高分辨率图片:用于论文或报告时,使用
plt.savefig('figure.png', dpi=300, bbox_inches='tight')保存高DPI图片,确保印刷清晰。bbox_inches='tight'可以自动裁剪图片周围的白边。
### 7.4 调试与求助
如果按照本文的代码,你的图仍然出现了奇怪的问题,可以按以下步骤排查:
- 检查Cartopy版本:确认
print(cartopy.__version__)输出的是0.21.0或更高。 - 简化问题:尝试用最小数据集(比如一个非常小的区域,几个数据点)和最简单的绘图命令(比如只画海岸线,不画数据)测试,看是否是基础投影设置有问题。
- 检查数据:打印你的
lon,lat,u,v数组的shape和范围,确保它们是你期望的样子,没有NaN或异常值。 - 查阅官方文档和社区:Cartopy的官方文档是很好的资源。遇到棘手问题,可以去GitHub的Cartopy仓库提交Issue,或者在Stack Overflow、气象家园等社区搜索和提问。描述问题时,最好能提供一个可复现的简单代码片段和数据样本(或生成模拟数据的方法)。
从我自己的体验来看,Cartopy 21.0在极地投影上的表现已经非常稳定可靠。它解决的不是一个两个小Bug,而是一系列影响根本使用的核心问题。这次升级,让我终于可以放下对m_map或其他工具的执念,重新回归到Python+C
437



被折叠的 条评论
为什么被折叠?



