Cartopy离散区间数据绘图异常:LinearRing点数非法问题求助
解决Cartopy绘制离散区间数据时的LinearRing错误
嘿,我之前也碰到过这个烦人的随机错误!本质上这是Cartopy在生成填色图/等值线的多边形时,搞出了只有3个点的LinearRing(线性环)——而OGR的几何规则明确要求LinearRing要么是空的,要么至少要有4个点(毕竟环得闭合,3个点的话连合法的闭合形状都凑不出来)。随机出现是因为你的随机数据偶尔会触发极端的数值分布,让等值线算法踩这个坑。
下面给你几个亲测有效的解决办法,按易用性排序:
1. 调整绘图参数,从源头避免小多边形
这是最直接的办法,在调用contourf的时候明确指定参数,强制算法生成合法的多边形:
- 首先确保你用的
levels就是你定义的V(你已经做了这一步,很好); - 添加
edgecolor='none'来避免绘制多边形的边缘,有时候边缘计算会催生小多边形; - 加上
extend='both'处理超出你定义区间的数值(如果有的话); - 确保
transform参数正确对应你的数据坐标系(比如ccrs.PlateCarree())。
示例代码调整后是这样:
import cartopy.crs as ccrs import matplotlib.pyplot as plt import numpy as np # 你的原始参数 V = np.arange(-1, 1.05, 0.05) # 模拟你的随机数据(复现用) array_fill = np.random.rand(len(V)-1, len(V)-1) # 创建地图轴 ax = plt.axes(projection=ccrs.PlateCarree()) ax.coastlines() # 关键调整后的绘图代码 contour_plot = ax.contourf( array_fill, levels=V, transform=ccrs.PlateCarree(), extend='both', edgecolor='none', antialiased=True ) plt.colorbar(contour_plot) plt.show()
2. 轻微平滑数据,消除局部突变
如果你的数据允许做轻微平滑,可以用scipy的高斯滤波处理一下,这样能避免局部数值跳变导致的小多边形生成:
from scipy.ndimage import gaussian_filter # 用sigma=1做轻微平滑,别太大以免丢失数据细节 smoothed_data = gaussian_filter(array_fill, sigma=1) # 用平滑后的数据绘图 contour_plot = ax.contourf( smoothed_data, levels=V, transform=ccrs.PlateCarree(), # 其他参数同上 )
3. 手动过滤不合法的多边形
如果上面的方法都没搞定,那就手动拦截并删掉那些不合格的小多边形。这个方法稍微底层一点,但能彻底解决问题:
# 先正常生成绘图对象 contour_plot = ax.contourf(...) # 遍历每个颜色对应的多边形集合 for collection in contour_plot.collections: valid_paths = [] # 检查每个路径的点数 for path in collection.get_paths(): # 合法的LinearRing至少要有4个点(闭合需要首尾重合) if len(path.vertices) >= 4: valid_paths.append(path) # 更新集合,只保留合法路径 collection.set_paths(valid_paths)
4. 升级依赖包,修复旧版本bug
这个错误有时候是Cartopy或者matplotlib的旧版本bug导致的,升级到最新版可能直接解决问题:
pip install --upgrade cartopy matplotlib
最后说下为什么会随机出现:当你的随机数据在某个极小的网格区域内,数值刚好卡在两个相邻level之间,等值线算法尝试生成闭合多边形时,只凑出了3个点——而OGR不允许这种不合法的LinearRing,于是就抛出了那个错误。
内容的提问来源于stack exchange,提问作者Vorticity0123
相关产品推荐
相关产品推荐

