安排来自Seaborn的Barplots

时间:2018-11-24 23:22:17

标签: python-3.x for-loop seaborn

我正在尝试对DF中“类别”列中出现的每个类别进行seaborn绘制。有7个独特的类别。我成功地做到了这一点,但是地块太小了。我想将它们分为两行(第一行为4行,第七行为3行)。除了应该将子图的参数更改为(2,4)的事实之外,我该如何更改代码?

fig, ax = plt.subplots(1, 7)

for i,g in enumerate(df.Category.unique()):
    dfx = df[df['Category'] == g]
    sns.set(style="whitegrid", rc={'figure.figsize':(28,6)})
    sns.barplot(x = dfx['Month'], y = dfx['measure'], ci = None, label = g, ax=ax[i])
    ax[i].legend(loc = 'lower center')

plt.tight_layout()
plt.show()

1 个答案:

答案 0 :(得分:1)

您可以在展平的坐标轴数组上循环,也可以使用groupby来简化事物。所以我想说代码看起来像这样(未经测试,因为问题中没有提供数据):

sns.set(style="whitegrid")

fig, axes = plt.subplots(2, 4)

for (n, dfx), ax in zip(df.groupby("Category"), axes.flat):
    sns.barplot(x = dfx['Month'], y = dfx['measure'], ci = None, label = n, ax=ax)
    ax.legend(loc = 'lower center')

axes[1,3].axis("off")
plt.tight_layout()
plt.show()

此外,由于您似乎在使用seaborn,因此您可以考虑使用seaborn.FacetGrid。 看起来像

sns.set(style="whitegrid")
g = sns.FacetGrid(data=df, col = "Category", col_wrap=4)
g.map(sns.barplot, "Month", "measure")
plt.tight_layout()
plt.show()