【问题标题】:How to create a FacetGrid stacked barplot using Seaborn?如何使用 Seaborn 创建 FacetGrid 堆叠条形图?
【发布时间】:2020-09-24 22:47:42
【问题描述】:

我正在尝试绘制一个带有堆积条形图的 facet_grid。

我想使用 Seaborn。它的 barplot 函数不包含堆叠参数。

我尝试将 FacetGrid.map 与自定义可调用函数一起使用。

import pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

def custom_stacked_barplot(col_day, col_time, col_total_bill, **kwargs):
    dict_df={}
    dict_df['day']=col_day
    dict_df['time']=col_time
    dict_df['total_bill']=col_total_bill
    df_data_graph=pd.DataFrame(dict_df)
    df = pd.crosstab(index=df_data_graph['time'], columns=tips['day'], values=tips['total_bill'], aggfunc=sum)
    df.plot.bar(stacked=True)

tips=sns.load_dataset("tips")
g = sns.FacetGrid(tips, col='size',  row='smoker')
g = g.map(custom_stacked_barplot, "day", 'time', 'total_bill')

但是,我分别得到一个空的画布和堆叠的条形图。

空画布:

Graph1 分开:

图表2:。

我该如何解决这个问题?感谢您的帮助!

【问题讨论】:

    标签: python matplotlib seaborn stacked-chart facet-grid


    【解决方案1】:

    您的不同 API 组合 (pandas.DataFrame.plot) 似乎无法与 (seaborn.FacetGrid) 集成。由于 seaborn 绘图不支持堆叠条形图,请考虑使用 matplotlib subplots 通过迭代 groupby 级别来开发您自己的版本:

    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    def custom_stacked_barplot(t, sub_df, ax):
        plot_df = pd.crosstab(index=sub_df["time"], columns=sub_df['day'], 
                               values=sub_df['total_bill'], aggfunc=sum)
    
        p = plot_df.plot(kind="bar", stacked=True, ax = ax, 
                         title = " | ".join([str(i) for i in t]))   
        return p
    
    tips = sns.load_dataset("tips")
    g_dfs = tips.groupby(["smoker", "size"])
    
    # INITIALIZE PLOT
    # sns.set()
    fig, axes = plt.subplots(nrows=2, ncols=int(len(g_dfs)/2)+1, figsize=(15,6))
    
    # BUILD PLOTS ACROSS LEVELS
    for ax, (i,g) in zip(axes.ravel(), sorted(g_dfs)):
        custom_stacked_barplot(i, g, ax)
    
    plt.tight_layout()
    plt.show()
    plt.clf()
    plt.close()
    

    并使用seaborn.set调整主题和调色板:

    【讨论】:

    • “由于 seaborn 绘图不支持堆叠条形图” 堆叠条形图已添加到 seaborn 0.11。
    【解决方案2】:

    实现该结果的最简单代码如下:

    import seaborn as sns
    import matplotlib.pyplot as plt
    sns.set()
    
    tips=sns.load_dataset("tips")
    g = sns.FacetGrid(tips, col = 'size',  row = 'smoker', hue = 'day')
    g = (g.map(sns.barplot, 'time', 'total_bill', ci = None).add_legend())
    
    plt.show()
    

    给出这个结果:

    【讨论】: