Можно ли обрезать пустые сетки в Seaborn Facetgrid?

Я пишу код в блокноте Jupyter, и у меня есть фасетная сетка Seaborn, в которой я хочу иметь 4 столбца и 3 строки. Каждый сюжет предназначен для отдельной страны из списка из 10 стран. Поскольку всего сеток 12, а последние две пусты, есть ли способ просто избавиться от этих двух последних сеток? Решение сделать размеры 5 x 2 не подходит, так как это слишком сложно увидеть, когда так много графиков скручены вместе.

Код:

ucb_w_reindex_age = ucb_w_reindex[np.isfinite(ucb_w_reindex['age'])]
ucb_w_reindex_age = ucb_w_reindex_age.loc[ucb_w_reindex_age['age'] < 120]

def ageSeries(country):
    return ucb_w_reindex_age.loc[ucb_w_reindex_age['country_destination'] == country].age.fillna(value=30).resample('5d').rolling(window=3, min_periods=1).mean()

def avgAge(country):
    return ucb_w_reindex_age.loc[ucb_w_reindex_age['country_destination'] == country].age.mean()

num_plots = 10
fig, axes = plt.subplots(3, 4,figsize=(20, 15))
labels = ["01/10", "09/10", "05/11", "02/12", "10/12", "06/13", "02/14"]

list_of_dfs = [{'country': item, 'age': ageSeries(item), 'avgAge': avgAge(item)} for item in ['US', 'FR', 'AU', 'PT', 'CA', 'DE', 'ES', 'GB', 'IT', 'NL']]

colors = ['blue', 'green', 'red', 'orange', 'purple', 'blue', 'green', 'red', 'orange', 'purple']
col, row, loop = (0, 0, 0)
for obj in list_of_dfs:
    row = math.floor(loop/4)

    sns.tsplot(data=obj['age'], color=colors[loop], ax=axes[row, col])
    axes[row, col].set_title('{}'.format(full_country_names[obj['country']]))
    axes[row, col].axhline(obj['avgAge'], color='black', linestyle='dashed', linewidth=4)
    axes[row, col].set(ylim=(20, 65))
    axes[row, col].set_xticklabels(labels, rotation=0)
    axes[row, col].set_xlim(0, 335)

    if col == 0:
        axes[row, col].set(ylabel='Average Age')

    col += 1
    loop += 1

    if col == 4:
        col = 0

fig.suptitle('Age Over Time', fontsize=30)
plt.show()

Facet Grid * Я знаю, что использование изображений здесь, в S.O., является табу, но на самом деле нет способа поместить это в код.

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


person TJB    schedule 20.07.2017    source источник


Ответы (1)


Я предполагаю, что вы создаете свои подсюжеты с помощью

fig, axes = plt.subplots(3, 4,figsize=(20, 15))

не seaborn.FacetGrid, как показано в ваших примерах кодов. Сначала вам нужно каким-то образом выяснить, от каких графиков вы хотите избавиться и каков их правильный индекс в axes. Затем вы можете использовать matplotlib.figure.Figure.delaxes() для удаления ненужных подзаголовков. . Вот пример:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(3, 4,figsize=(20, 15))
fig.delaxes(axes[2, 2])
fig.delaxes(axes[2, 3])
plt.show()

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

Удаление подзаголовков из seaborn.FacetGrid в чем-то похоже. Единственная незначительная деталь: вы получите доступ к axes через g.axes:

import matplotlib.pyplot as plt
import seaborn as sns

tips = sns.load_dataset("tips")
g = sns.FacetGrid(tips, col="time", row="smoker", sharex=False, sharey=False)
g.fig.delaxes(g.axes[1, 1])
plt.show()

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

person Y. Luo    schedule 20.07.2017
comment
Ах, извините, я предполагаю, что я использую подзаголовки, а не фасетную сетку. Но ваше решение сработало! Спасибо Y. Lou - person TJB; 20.07.2017
comment
@TimothyJosephBaney Добавил коды для seaborn.FacetGrid на всякий случай. Пожалуйста, проверьте, если необходимо. - person Y. Luo; 20.07.2017