Cartopy中set_extent导致圆形绘图边缘被裁剪的问题及解决方法
问题成因与解决方案
成因分析
当调用 set_extent 时,Cartopy会将你传入的PlateCarree坐标系下的矩形地理范围,转换为当前Orthographic投影下的边界框,并将绘图轴的显示范围调整为这个边界框的大小。由于Orthographic投影的圆形边缘代表可见半球的边界,而转换后的边界框是矩形,因此绘图时会裁剪掉超出矩形范围的圆形部分,导致原本的圆形绘图变成带裁剪边缘的矩形。
解决方法
以下两种方式可以有效保持绘图的圆形边缘:
方法1:手动调整轴范围适配圆形(兼容所有Cartopy版本)
在设置完范围后,重新计算轴的显示范围,确保其为包含目标区域的正方形,从而完整显示圆形边界:
# 先设置目标地理范围 ax1.set_extent([lon_ref.min(), lon_ref.max(), lat_ref.min(), lat_ref.max()], crs=ccrs.PlateCarree()) # 获取当前轴的范围 x_min, x_max = ax1.get_xlim() y_min, y_max = ax1.get_ylim() # 计算正方形范围的中心和边长 center_x = (x_min + x_max) / 2 center_y = (y_min + y_max) / 2 side_length = max(x_max - x_min, y_max - y_min) # 设置正方形轴范围,确保圆形边界完整显示 ax1.set_xlim(center_x - side_length/2, center_x + side_length/2) ax1.set_ylim(center_y - side_length/2, center_y + side_length/2)
方法2:使用keep_aspect参数(Cartopy 0.18及以上版本)
Cartopy 0.18版本新增了keep_aspect参数,设置为True可直接保持投影的原始宽高比,避免圆形边缘被裁剪:
ax1.set_extent([lon_ref.min(), lon_ref.max(), lat_ref.min(), lat_ref.max()], crs=ccrs.PlateCarree(), keep_aspect=True)
内容的提问来源于stack exchange,提问作者Victoire Buffet
相关产品推荐
相关产品推荐

