ax.set_xticks导致Cartopy+Matplotlib绘制的地形图异常收缩问题
问题原因
- 这是Cartopy投影轴的常见使用误区:直接调用Matplotlib原生
set_xticks()方法时,没有指定对应投影的坐标参考系(CRS),Matplotlib会默认使用画布像素坐标系解析你传入的经纬度刻度值,错误触发轴范围和宽高比重算,最终导致地图收缩。 - y轴设置未触发问题属于巧合:你的纬度数值范围和画布高度的比例刚好匹配投影默认约束,没有触发重算逻辑,不代表操作本身是规范的。
解决方法
两种方案选其一即可:
方案1:给set_xticks补充crs参数(改动最小)
把你注释的刻度设置行改为如下格式,set_yticks也建议同步补充参数保证规范:
ax.set_xticks(np.linspace(Lonmin, Lonmax, 5), crs=ccrs.PlateCarree()) ax.set_yticks(np.linspace(Latmin, Latmax, 5), crs=ccrs.PlateCarree())
方案2:使用Cartopy官方推荐的gridlines设置刻度(更灵活)
完全删掉原生set_xticks/set_yticks/set_xlabel/set_ylabel相关代码,替换为gridlines对象配置刻度,不会破坏投影轴的比例约束,还支持更丰富的样式调整:
首先导入刻度定位器依赖:
import matplotlib.ticker as mticker
然后替换原来的ax.gridlines()行及后续刻度标签配置:
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True, linestyle='--', alpha=0.7) # 隐藏上、右两侧的冗余标签 gl.top_labels = False gl.right_labels = False # 设置自定义刻度 gl.xlocator = mticker.FixedLocator(np.linspace(Lonmin, Lonmax, 5)) gl.ylocator = mticker.FixedLocator(np.linspace(Latmin, Latmax, 5)) # 自定义标签样式 gl.xlabel_style = {'fontsize':15} gl.ylabel_style = {'fontsize':15, 'rotation':0}
内容的提问来源于stack exchange,提问作者Xuyang Wang
相关产品推荐
相关产品推荐

