укажите расположение метки lat / lon в картографии (удалить с некоторых сторон)

#python-3.x #label #cartopy #gridlines

#python-3.x #метка #картография #линии сетки

Вопрос:

Новая возможность в Cartopy 0.18.0 добавлять метки широты / широты для любой картографической проекции превосходна. Это отличное дополнение к этому пакету. На некоторых картах, особенно в полярных регионах, метки широты / широты могут быть очень переполнены. Вот пример.

 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
  

Вот график вывода: я пока не могу встроить изображение, поэтому вот ссылка

То, что я ищу, — это иметь метки lat с левой и правой сторон и метки lon внизу, без меток вверху. Это можно легко сделать в базовой карте, используя список флагов. Мне интересно, возможно ли это с помощью cartopy сейчас. Несколько неудачных попыток:

  1. Я наткнулся на открытую проблему Github для cartopy по аналогичной теме, но предложенный метод не работает для этого случая. Добавление gl.ylocator = mticker.FixedLocator(yticks) ничего не делает, и добавление gl.xlocator = mticker.FixedLocator(xticks) избавляет от большинства меток lon, за исключением строки 180 с левой и правой сторон, но все остальные метки lon отсутствуют. Метка широты 80N все еще находится сверху, см. Здесь . После более тщательного прочтения этого потока кажется, что это все еще продолжается для будущих выпусков cartopy.
  2. Использование gl.top_labels=False также не работает.
  3. Установка y_inline значения True делает метки lat полностью удаленными. Я предполагаю, что это может быть из-за степени осей, которую я использовал. Метки широты могут находиться на некоторых линиях долготы за пределами поля. Это отдельный вопрос о том, как указать линии долготы / местоположения встроенных меток.

Прямо сейчас я решил отключить метки. Любые предложения и временные решения будут оценены. На данный момент карты, подобные приведенным выше примерам, полезны для быстрого просмотра, но не готовы для какого-либо формального использования.

ОБНОВЛЕНИЕ: на основе предложения @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('')

  

Это почти то, что я хотел, за исключением того, что метки 74N отсутствуют, потому что они близки к меткам 170W по бокам, а cartopy выбрал метку 170W вместо 74N. Поэтому мне нужно немного больше простых настроек, чтобы вернуть его туда.

Ответ №1:

Это может быть обходным путем для вашего проекта, пока не появится лучшее решение.

 # 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()
  

Выходной график:

outputplot

Комментарии:

1. Спасибо, это действительно полезно. По крайней мере, это позволяет мне выполнять работу до тех пор, пока из cartopy не выйдет обновление, чтобы исправить это.