You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 19:07:42