#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 сейчас. Несколько неудачных попыток:
- Я наткнулся на открытую проблему Github для cartopy по аналогичной теме, но предложенный метод не работает для этого случая. Добавление
gl.ylocator = mticker.FixedLocator(yticks)
ничего не делает, и добавлениеgl.xlocator = mticker.FixedLocator(xticks)
избавляет от большинства меток lon, за исключением строки 180 с левой и правой сторон, но все остальные метки lon отсутствуют. Метка широты 80N все еще находится сверху, см. Здесь . После более тщательного прочтения этого потока кажется, что это все еще продолжается для будущих выпусков cartopy. - Использование
gl.top_labels=False
также не работает. - Установка
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()
Выходной график:
Комментарии:
1. Спасибо, это действительно полезно. По крайней мере, это позволяет мне выполнять работу до тех пор, пока из cartopy не выйдет обновление, чтобы исправить это.