geopandas управляет размером легенды при использовании xlim, ylim

#matplotlib #geopandas

#matplotlib #геопанды

Вопрос:

Я пытаюсь создать график геопанды, где мне нужно установить конкретные значения для xlim и ylim . Это работает, но легенда теперь огромна. Я бы предпочел, чтобы он был таким же большим, как фактическая нанесенная карта, но, похоже, не могу понять, как контролировать это поведение.

Минимальный рабочий пример

 import numpy as np
import matplotlib; print(matplotlib.__version__)
import matplotlib.pyplot as plt
import geopandas; print(geopandas.__version__)
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))    
fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
ax.axis('off')

world.plot(ax=ax, column='2015', legend=True,
           legend_kwds={'label': "Population", 'orientation': "horizontal"})
minx, miny, maxx, maxy = -12, 30, 30,80 
ax.set_xlim(minx, maxx)
ax.set_ylim(miny, maxy)
ax.margins(0)
ax.tick_params(left=False, labelleft=False, bottom=False, labelbottom=False)

plt.savefig('sample.png', bbox_inches="tight", pad_inches=0)
 

Результирующий график со quot;слишком большойquot; легендой

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

1. Как world определяется переменная?

2. он поставляется вместе с модулем; запустил код, чтобы увидеть

3. Если я выполню ваш пример, world не определено. вы уверены, что не импортировали его откуда-нибудь?

Ответ №1:

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

Однако внешний вид осей легенды и графика по умолчанию может быть нежелательным. Можно определить оси графика (с помощью ax) и оси легенды (с помощью cax), а затем передать их в вызов plot.


Тем не менее, для вашего случая вы должны попробовать это:

 ... # Your imports as they are
from mpl_toolkits.axes_grid1 import make_axes_locatable

fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
ax.axis('off')

divider = make_axes_locatable(ax)  # Define 'divider' for the axes
# Legend axes will be located at the 'bottom' of figure, with width '5%' of ax and
# a padding between them equal to '0.1' inches 
cax = divider.append_axes("bottom", size="5%", pad=0.1)

world.plot(ax=ax, column='2015', legend=True,
           legend_kwds={'label': "Population", 'orientation': "horizontal"},
           cax=cax)
           ^^^^^^^  # Add cax in the list of 'plot' arguments

... # Rest code as it is

 

Например, с вашим кодом и дополнениями к нему, о которых я упоминал выше, для world GeoDataFrame как:

 world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
 

и column='pop_est' вывод:

введите описание изображения здесь


Краткое объяснение

AxesGrid toolkit представляет собой набор вспомогательных классов, в основном для упрощения отображения (нескольких) изображений в Matplotlib. В документах указано, что:

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

Таким образом, в чистом Matplotlib сложнее вмешиваться в согласование размеров осей рисунка и цветовой панели. С AxesDivider помощью класса инструментария вы можете легко синхронизировать оси цветовой панели с основными осями рисунка, как показано выше.