在 cartopy 中指定 lat/lon 标签位置(在某些方面删除)

specify the lat/lon label location in cartopy (remove at some sides)

Cartopy 0.18.0 中为任何地图投影添加 lat/lon 标签的新功能非常出色。这是对这个包的一个很好的补充。对于某些地图,尤其是在极地地区,lat/lon 标签可能非常拥挤。这是一个例子。

from matplotlib import pyplot as plt
import numpy as np
import cartopy.crs as ccrs

pcproj = ccrs.PlateCarree()
lon0 = -150
mapproj = ccrs.LambertAzimuthalEqualArea(
    central_longitude=lon0,central_latitude=75,
    )
XLIM = 600e3; YLIM=700e3
dm =5; dp=2

fig = plt.figure(0,(7,7))
ax  = fig.add_axes([0.1,0.1,0.85,0.9],projection=mapproj)
ax.set_extent([-XLIM,XLIM,-YLIM,YLIM],crs=mapproj)
ax.coastlines(resolution='50m',color='.5',linewidth=1.5)
lon_grid = np.arange(-180,181,dm)
lat_grid = np.arange(-80,86,dp)
gl = ax.gridlines(draw_labels=True,
                  xlocs=lon_grid,ylocs=lat_grid,
                  x_inline=False,y_inline=False,
                  color='k',linestyle='dotted')
gl.rotate_labels = False

这是输出图:I can't embed image yet, so here is the link

我要找的是左右两侧有纬度标签,底部有经度标签,顶部没有标签。这可以使用标志列表在底图中轻松完成。我想知道现在是否可以使用 cartopy。 几次失败的尝试:

  1. 我遇到了 Github open issue for cartopy on a similar topic, but the suggested method does not work for this case. Adding gl.ylocator = mticker.FixedLocator(yticks) does nothing and adding gl.xlocator = mticker.FixedLocator(xticks) gets rid of most of lon labels except the 180 line on left and right sides but all the other lon labels are missing. The 80N lat label is still on the top, see here。在仔细阅读该线程后,它似乎仍在为未来的 cartopy 版本而努力。
  2. 使用gl.top_labels=False也不行。
  3. y_inline 设置为 True 会使纬度标签完全消失。我想这可能是因为我使用的轴范围。纬度标签可能位于框外的某些经度线上。这是一个单独的问题,关于如何指定行内标签的经度lines/locations。

现在,我选择关闭标签。任何建议和临时解决方案将不胜感激。在这一点上,上面示例中的地图可用于快速浏览,但还不能正式使用。

更新: 根据@swatchai 的建议,有以下临时解决方法:

# --- add _labels attribute to gl
plt.draw()

# --- tol is adjusted based on the positions of the labels relative to the borders.
tol = 20
for ea in gl._labels:
    pos = ea[2].get_position()
    t_label = ea[2].get_text()
    # --- remove lon labels on the sides
    if abs(abs(pos[0])-XLIM)<tol:
        if 'W' in t_label or 'E' in t_label or '180°' in t_label:
            print(t_label)
            ea[2].set_text('')
    # --- remove labels on top 
    if abs(pos[1]-YLIM)<tol:
        ea[2].set_text('')

这几乎是我想要的除了the 74N labels are missing因为它靠近侧面的170W标签并且cartopy选择了170W标签而不是74N。所以我需要做一些更简单的调整才能把它放回原处。

在出现更好的解决方案之前,这可能是您项目的解决方法。

# more code above this line

# this suppresses drawing labels on top edges
# only longitude_labels disappear, some latitude_labels persist
gl.top_labels=False

# workaround here to manipulate the remaining labels
plt.draw()  #enable the use of ._lables()
for ea in gl._labels:
    #here, ea[2] is a Text object
    #print(ea)
    if '80°N'==ea[2].get_text():
        # set it a blank string
        ea[2].set_text("")

ax.set_title("No Labels on Top Edge");
plt.show()

输出图: