Расставь боксы как сетку с морским бортом `FacetGrid` - PullRequest
3 голосов
/ 17 февраля 2020

У меня есть фрейм данных с тремя столбцами Features, CV-fold, Accuracy, Network. Я хочу иметь блокпост для каждой Сети, сгруппированный по функциям и CV-сгибу для оси (см. Пример изображения).

Output right now

df = pd.read_csv(path)
df['Features'] = df["Features"].astype('category')
ordered_features = sorted(df.Network.value_counts().index)

df = df.loc[df['Accuracy'] > 0.1]
df.Accuracy = df.Accuracy*100

#sns.color_palette("husl", len(df['CV-fold'].value_counts().index))
#sns.set_palette('husl', len(df['CV-fold'].value_counts().index))

g = sns.FacetGrid(df, row="Network", row_order=ordered_features,
                  height=3, aspect=3, legend_out=True, despine=False)
g.map(sns.boxplot, x="CV-fold", y="Accuracy", hue="Features", data=df, palette='muted').add_legend()

g.set_axis_labels("", "Accuracy (%)")

Поскольку у меня есть 8 различных сетей, я бы хотел, чтобы они не были все в столбце или строке, а были отформатированы в виде сетки (например, 2x4). Кроме того, даже если sharex не включено, ось x помечена только на самом нижнем графике.

Как я могу это сделать?

1 Ответ

2 голосов
/ 17 февраля 2020

Вы использовали бы ключевое слово col_wrap, чтобы получить графики на нескольких строках с несколькими столбцами.

Для повторения меток оси X используйте ax.tick_params().

Пример:

import seaborn as sns, matplotlib.pyplot as plt

tips = sns.load_dataset('tips')
ordered_days = sorted(tips['day'].unique())
g = sns.FacetGrid(tips,col='day',col_order=ordered_days,col_wrap=2)
#                                               change this to 4 ^
g.map(sns.boxplot,'sex','total_bill',palette='muted')
for ax in g.axes.flatten(): 
    ax.tick_params(labelbottom=True)
plt.tight_layout()
plt.show()

Результат: enter image description here

...