带有相对频率或密度曲线的计数图

时间:2019-07-14 04:24:08

标签: python comparison seaborn distribution categorical-data

我正在尝试可视化三组(色相)数据的分类数据。使用seaborn,似乎countplot()可以解决问题(下面的文档链接中的第二个示例看起来像我所需要的)。但是,不是在y轴上计数,而是可以按组将其设为比例吗?

在链接的第二个示例中,第一类,第二类和第三类的Man组(蓝色条形)分别约为22%,18%,60%,而不是计数。对妇女和儿童团体也将这样做。

Seaborn Example

1 个答案:

答案 0 :(得分:1)

据我所知,这不是直接在Seaborn中进行的选择,但是您可以手动创建比例计数数据集并使用sns.barplot进行绘制:

df = sns.load_dataset('titanic')
# [1] Simple count
sns.countplot(x='class', data=df)
plt.show()
# [1B] By percent
pct = df['class'].value_counts(normalize=True).reset_index().rename({'index':'class','class':'percent'}, axis=1)
sns.barplot(x='class', y='percent', data=pct)
plt.show()

# [2] Two var count
sns.countplot(x='class', hue='who', data=df)
plt.show()
# [2b] By percent
pct2 = (df.groupby(['class','who']).size() / df.groupby(['class']).size()).reset_index().rename({0:'percent'}, axis=1)
sns.barplot(x='class', hue='who', y='percent', data=pct2)
plt.show()

enter image description here

enter image description here


每个评论的编辑

通过更改用于计算pct数据帧的分数的分母,可以相当容易地修改要计算的百分比。

# [3] Grouped by 'class'; hue by 'who'
# IIUC, this is what you're asking for
pct3 = (df.groupby(['class','who']).size() / df.groupby(['who']).size()).reset_index().rename({0:'percent'}, axis=1)
sns.barplot(x='class', hue='who', y='percent', data=pct3)
plt.show()

enter image description here

您还可以通过在hue命令中交换xsns.boxplot参数来更改分组。在我看来,第二个选项更加直观。

# [3b] Grouped by 'who'; hue by 'class'
# In my view, this is a bit more intuitive; each grouping sums to 100%, 
# and you can compare across class for men, women, and children more easily
sns.barplot(x='who', hue='class', y='percent', data=pct3)
plt.show()

enter image description here