【问题标题】:Concatenating multiple barplots in seaborn在seaborn中连接多个条形图
【发布时间】:2018-09-12 21:27:00
【问题描述】:

我的数据框包含以下列标题:主题、组、MASQ_GDA、MASQ_AA、MASQ_GDD、MASQ_AD

我成功地使用具有以下规格的条形图绘制了其中一个:

bar_plot = sns.barplot(x="Group", y='MASQ_GDA', units="subject", ci = 68, hue="Group", data=demo_masq)

但是,我正在尝试并排创建几个这样的条形图。可能有人知道我如何做到这一点,因为每个图都包含剩余的 3 个变量(MASQ_AA、MASQ_GDD、MASQ_AD)。这是我想要实现的一个示例。

【问题讨论】:

    标签: python-3.x bar-chart seaborn


    【解决方案1】:

    如果您查看the documentation for sns.barplot(),您将看到该函数接受一个参数ax=,允许您告诉seaborn 使用哪个Axes 对象来绘制结果

    ax : matplotlib 轴,可选

    要在其上绘制绘图的 Axes 对象,否则使用当前 Axes。

    因此,获得所需输出的简单方法是预先创建Axes,然后使用对应的ax参数调用sns.barplot()

    fig, axs = plt.subplots(1,4)  # create 4 subplots on 1 row
    for ax,col in zip(axs,["MASQ_GDA", "MASQ_AA", "MASQ_GDD", "MASQ_AD"]):
        sns.barplot(x="Group", y=col, units="subject", ci = 68, hue="Group", data=demo_masq, ax=ax)  # <- notice ax= argument
    

    另一个选项,也许更符合 seaborn 理念的选项是使用a FacetGrid。这将允许您根据数据集中的类别数量自动创建所需数量的子图。但是,它需要重新调整您的数据框,以便 MASQ_* 列的内容位于单个列上,并在新列中显示每个值对应的类别。

    【讨论】:

    • 感谢您提供的信息。第一个选项有效,但是,它会导致 y 轴标签叠加在条形图上,而不仅仅是一个。不漂亮。此外,图例叠加不正确,顺序(色调)不一致。你知道纠正这些的方法吗?如果没有,我会按照你的建议去重塑数据集。再次感谢。
    • 要么你必须为每个绘图使用barplot() 的选项以获得所需的输出,或者你必须使用 FacetGrid(或 v.0.9 中的新 sns.catplot()。 0) ,但您必须转换数据