我正在尝试可视化三组(色相)数据的分类数据。使用seaborn,似乎countplot()可以解决问题(下面的文档链接中的第二个示例看起来像我所需要的)。但是,不是在y轴上计数,而是可以按组将其设为比例吗?
在链接的第二个示例中,第一类,第二类和第三类的Man组(蓝色条形)分别约为22%,18%,60%,而不是计数。对妇女和儿童团体也将这样做。
答案 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()
通过更改用于计算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()
您还可以通过在hue
命令中交换x
和sns.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()