Общая легенда в мультиплоте Geo Pandas - PullRequest
0 голосов
/ 28 февраля 2020

Я создаю мультиплот с Geo Pandas GeoDataFrame.plot() для каждого месяца. Как я могу использовать общую легенду, а также оси x и y для всех подсюжетов и управлять размером фигуры?.

Я знаю, что есть sharex=True и sharey=True, но я не знаю, где его разместить.

plt.figure(sharex=True, sharey=True) возврат TypeError: __init__() got an unexpected keyword argument 'sharex'

world.plot(column='pop_est', ax=ax, legend=True, sharex=True, sharey=True) возврат AttributeError: 'PatchCollection' object has no property 'sharex'

ax = plt.subplot(4, 3, index + 1, sharex=True, sharey=True) возврат TypeError: cannot create weak reference to 'bool' object

import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt

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

months = pd.DataFrame(["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
                      columns = ['months'])

plt.figure()

for index, i in months.iterrows():
    ax = plt.subplot(4, 3, index + 1) # nrows, ncols, axes position
    world.plot(column='pop_est', ax=ax, legend=True)
    ax.set_title(index)
    ax.set_aspect('equal', adjustable='datalim')

plt.suptitle('This is the figure title', fontsize=12, y=1.05)
plt.tight_layout()
plt.show()

enter image description here

1 Ответ

1 голос
/ 04 марта 2020

Ключевые слова shared_x и share_y уже объяснены @ImportanceOfBeingErnest в комментариях выше. Это прекрасно работает, я бы лично убрал все галочки / метки, если вы показываете весь мир. Но для подмножеств это может быть полезно.

Создание общей легенды (которую Matplotlib назвал бы цветовой панелью, а не легендой) немного сложновато, потому что Geo pandas не возвращает оси вместо mapabble (как обычно делает Matplotlib). Простой обходной путь - получить его из коллекций осей, но для этого требуются некоторые предположения о том, какое сопоставление необходимо, если их несколько.

В этом случае есть только 1 (набор патчей) на оси, и он идентичен для каждой оси. Таким образом, получение ih с помощью axs[0].collections[0] является простым, но не самым надежным решением.

Альтернативой может быть создание начального cax и предоставление его для графика Geo pandas с использованием ключевого слова cax=cax , Но создание cax вручную (с fig.add_axes ([]) менее удобно.

Использование fig.colorbar, как показано ниже, кажется более простым, поскольку позволяет создавать cax на основе списка / массива осей.

fig, axs = plt.subplots(4,3, figsize=(10,7), 
                        facecolor='w',
                        constrained_layout=True, 
                        sharex=True, sharey=True, 
                        subplot_kw=dict(aspect='equal'))

axs = axs.ravel()

fig.suptitle('This is the figure title', fontsize=12, y=1.05)

for index, i in months.iterrows():

    axs[index].set_title(index)
    world.plot(column='pop_est', ax=axs[index])


# assume it's the first (and only) mappable
patch_col = axs[0].collections[0]
cb = fig.colorbar(patch_col, ax=axs, shrink=0.5)

enter image description here

...