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

Countplot with relative frequencies or density curves

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

在 link 的第二个示例中,男性组(蓝色条)在第一、第二和第三 class 中分别约为 22%、18%、60%,而不是计数。妇女和儿童组也是如此。

Seaborn Example

据我所知,这不是直接在 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()


每条评论的编辑次数

您可以通过更改用于计算 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()

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

# [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()