#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)
Комментарии:
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
помощью класса инструментария вы можете легко синхронизировать оси цветовой панели с основными осями рисунка, как показано выше.