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

如何调整Cartopy北极立体投影下纬度网格线标签的位置?

调整Cartopy北极立体投影的纬度网格标签位置

我正在尝试调整Cartopy中使用北极立体投影(NorthPolarStereo)时网格线标签(尤其是纬度标签)的位置。当前绘图代码如下:

import matplotlib.pyplot as plt
import matplotlib.path as mpath
import numpy as np
import cartopy.crs as ccrs

# Helper function
def polarCentral_set_latlim(lat_lims, ax):
    ax.set_extent([-180, 180, lat_lims[0], lat_lims[1]], ccrs.PlateCarree())
    theta = np.linspace(0, 2*np.pi, 100)
    center, radius = [0.5, 0.5], 0.5
    verts = np.vstack([np.sin(theta), np.cos(theta)]).T
    circle = mpath.Path(verts * radius + center)
    ax.set_boundary(circle, transform=ax.transAxes)

fig = plt.figure(figsize=(6,6))
ax = fig.add_subplot(1,1,1,projection=ccrs.NorthPolarStereo(central_longitude=0))
ax.coastlines(linewidth=0.5,color='k')
ax.gridlines(color='C7',lw=1,ls=':',draw_labels=True,rotate_labels=False,ylocs=[60,70,80])
polarCentral_set_latlim((50,90),ax)

极地立体投影图,网格线标签默认位置

奇怪的是,即使设置了不同的central_longitude,纬度标签始终显示在约150E处。我希望将其与180度经线对齐,但在gridlines函数的文档中找不到设置标签位置的选项。请问我是否遗漏了相关设置,还是必须使用plt.text()手动放置标签?


不需要手动用plt.text()添加标签,可以通过两种方式调整纬度标签的位置:

方法1:指定网格线的经度位置,让标签落在180°经线

Cartopy的gridlines函数可以通过xlocs参数指定要显示的经线,纬度标签会默认绘制在这些经线的位置上。只需在调用gridlines时添加xlocs=[180],就能让纬度标签对齐180°经线:

ax.gridlines(color='C7', lw=1, ls=':', draw_labels=True, rotate_labels=False, 
             ylocs=[60,70,80], xlocs=[180])

如果需要显示其他经线的网格线但只在180°处显示纬度标签,可以分两次绘制:

# 绘制所有需要的网格线,不显示标签
ax.gridlines(color='C7', lw=1, ls=':', draw_labels=False, ylocs=[60,70,80], 
             xlocs=[0, 60, 120, 180, -120, -60])
# 仅在180°经线处绘制带纬度标签的网格线
ax.gridlines(color='C7', lw=1, ls=':', draw_labels=True, rotate_labels=False, 
             ylocs=[60,70,80], xlocs=[180])

方法2:修改现有标签的位置

如果需要更灵活的调整,可以获取gridlines返回的标签对象,手动修改它们的经度坐标:

gl = ax.gridlines(color='C7', lw=1, ls=':', draw_labels=True, rotate_labels=False, 
                  ylocs=[60,70,80])
# 遍历所有纬度标签,修改其经度为180°
for label in gl.yaxis.get_ticklabels():
    # 将标签的地理坐标改为(180°, 对应纬度)
    label.set_position((180, float(label.get_text())))
    # 应用投影转换
    label.set_transform(ccrs.PlateCarree()._as_mpl_transform(ax))

这两种方法都能实现让纬度标签对齐180°经线的需求,无需手动逐个添加文本。


内容的提问来源于stack exchange,提问作者katzenjammer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:15:26