如何使用 Seaborn 创建 FacetGrid 堆叠条形图?

Posted

技术标签:

【中文标题】如何使用 Seaborn 创建 FacetGrid 堆叠条形图?【英文标题】:How to create a FacetGrid stacked barplot using Seaborn? 【发布时间】: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:。

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

【问题讨论】:

【参考方案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()

给出这个结果:

【讨论】:

以上是关于如何使用 Seaborn 创建 FacetGrid 堆叠条形图?的主要内容,如果未能解决你的问题,请参考以下文章

如何反转 seaborn 图形级别图的轴(FacetGrid)

如何在 seaborn 的 facetgrid 中设置可读的 xticks?

python 示例显示如何使用累积比绘制直方图。使用seaborn.FacetGrid()绘制多个直方图。

seaborn使用FacetGrid函数可视化山脊图(Ridgeline Plot with Seaborn)

使用数据框更改绘图 Seaborn Facetgrid 中同一行的线型

Seaborn facetgrid将逗号添加到y轴标签[重复]