Cartopy绘制地图时90°N与90°S网格线标记不显示的问题排查求助
嘿,这个问题我之前帮人排查过,本质是Cartopy处理极点网格标签的默认逻辑导致的——90°N和90°S作为所有经线的交汇点,常规的网格标签渲染会自动跳过这些特殊点,避免出现标签重叠或位置混乱的问题。不过咱们可以通过手动添加标签的方式完美解决,下面是具体的分析和修改后的代码:
为什么90°N/S的网格标签不显示?
Cartopy的gridlines()方法在PlateCarree(等距圆柱)投影下,会默认跳过极点(90°N/90°S)的标签绘制。这是因为极点是所有经线的汇聚点,程序无法为这个单一位置分配合理的标签布局(总不能在同一个点堆一堆经线标签吧),所以直接忽略了这两个特殊纬度的标签渲染。
另外还要提一下你代码里的一个小疏忽:ax.set_extent([-180, -180, -90, 90])的经度范围写错了,应该是[-180, 180, -90, 90],不然地图只会显示一条经线,我已经在下面的修正代码里改过来了。
解决方案:手动添加极点标签
我们可以在原有网格线绘制完成后,手动给90°N和90°S添加文本标签,并且匹配原有网格标签的样式,保证视觉统一:
import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature fig = plt.figure(figsize=[15, 15]) ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree()) # 修正了set_extent的经度范围错误 ax.set_extent([-180, 180, -90, 90]) ax.add_feature(cfeature.COASTLINE, zorder=100) ax.add_feature(cfeature.BORDERS, zorder=100) ax.add_feature(cfeature.LAKES, edgecolor='black', facecolor='none', zorder=11) # 原有网格线设置,保留你的配置 gl = ax.gridlines( xlocs=range(-180, 181, 30), ylocs=range(-90, 91, 30), color='black', linestyle='dotted', zorder=100, draw_labels=True ) gl.top_labels = False gl.right_labels = False gl.bottom_labels = True gl.left_labels = True # 获取原有网格标签的样式,保证手动添加的标签风格一致 label_font = { 'fontsize': gl.label_style.get('fontsize', 10), 'fontfamily': gl.label_style.get('fontfamily', 'sans-serif'), 'color': gl.label_style.get('color', 'black') } # 手动添加90°N标签,放在顶部中间,垂直对齐到底部 ax.text( 0, 90, '90°N', transform=ccrs.PlateCarree(), ha='center', va='bottom', **label_font ) # 手动添加90°S标签,放在底部中间,垂直对齐到顶部 ax.text( 0, -90, '90°S', transform=ccrs.PlateCarree(), ha='center', va='top', **label_font ) plt.show()
这样修改后,你就能在地图的顶部和底部中间位置看到90°N和90°S的标签了,而且样式和其他网格标签完全一致。
内容的提问来源于stack exchange,提问作者morhc
相关产品推荐
相关产品推荐

