每个色调的堆叠条计数图[重复]

Posted

技术标签:

【中文标题】每个色调的堆叠条计数图[重复]【英文标题】:count plot with stacked bars per hue [duplicate] 【发布时间】:2018-10-23 11:33:59 【问题描述】:

我正在寻找一种根据“色调”绘制带有堆叠条形的计数图的有效方法。 标准色调行为是根据第二列的值将计数拆分为平行条,我正在寻找一种有效的方法来堆叠色调条以便快速比较总数。

让我用 Titanic 数据集中的一个例子来解释一下:

import pandas as pd
import numpy as np
import seaborn as sns
%matplotlib inline

df = sns.load_dataset('titanic')
sns.countplot(x='survived',hue='class',data=df)

使用 countplot 和 hue 提供标准 Seaborn 行为

我正在寻找的是每个色调的堆叠条

为了获取最后一张图片,我使用了以下代码

def aggregate(rows,columns,df):
    column_keys = df[columns].unique()
    row_keys = df[rows].unique()

    agg =  key : [ len(df[(df[rows]==value) & (df[columns]==key)]) for value in row_keys]
               for key in column_keys 

    aggdf = pd.DataFrame(agg,index = row_keys)
    aggdf.index.rename(rows,inplace=True)

    return aggdf

aggregate('survived','class',df).plot(kind='bar',stacked=True)

我相信有一些更有效的方法。 我知道 seaborn 对堆叠条不太友好......所以我尝试使用我的函数重新排列数据集并使用 matplotlib,但我想还有一种更聪明的方法可以做到这一点。

非常感谢!

【问题讨论】:

【参考方案1】:

你的最后一部分基本上在那里,使用DataFrame.plot()barstacked=True

您可以使用groupby + pivot 代替您的aggregate 函数来完成您想要的事情。

df_plot = df.groupby(['class', 'survived']).size().reset_index().pivot(columns='class', index='survived', values=0)

class     First  Second  Third
survived                      
0            80      97    372
1           136      87    119

从这里您可以将其绘制为带有stacked=True 参数的bar

df_plot.plot(kind='bar', stacked=True)

【讨论】:

2019年不行。需要用到:df_plot.plot.bar(stacked=True) @WojciechMoszczyński。谢谢,它也可以删除导致问题的 x= 参数。 @ALollz @Marcello 使用 seaborn 0.11,您可以通过非常简单的方式实现相同的目标:sns.displot(df, x='survived', hue='class', multiple='stack')

以上是关于每个色调的堆叠条计数图[重复]的主要内容,如果未能解决你的问题,请参考以下文章

seaborn和pandas中带有色调的堆叠条[重复]

具有重复颜色的 HTML5 图表堆叠条形图

更改代码以允许超过 3 个堆叠条

ggplot - 如何堆叠和分组条形图?

调整ggplot2中堆叠条的顺序

R语言ggplot2可视化:可视化堆叠的直方图添加每个分组的每个bin的计数标签在堆叠直方图的bin中的每个分组部分添加数值标签