![](/img/trans.png)
[英]How to plot a bar plot of 2 categorical columns using matplotlib or seaborn
[英]How to plot stacked 100% bar plot with seaborn for categorical data
我有一个看起来像这样的数据集(假设它在Clicked
有 4 个类别, head(10)
只显示 2 个类别):
Rank Clicked
0 2.0 Cat4
1 2.0 Cat4
2 2.0 Cat4
3 1.0 Cat1
4 1.0 Cat4
5 2.0 Cat4
6 2.0 Cat4
7 3.0 Cat4
8 5.0 Cat4
9 5.0 Cat4
这是返回此图的代码:
eee = (df.groupby(['Rank','Clicked'])['Clicked'].count()/df.groupby(['Rank'])['Clicked'].count())
eee.unstack().plot.bar(stacked=True)
plt.legend(['Cat1','Cat2','Cat3','Cat4'])
plt.xlabel('Rank')
有没有办法用seaborn(或matplotlib)而不是pandas绘图功能来实现这一点? 我尝试了几种方法,包括运行 seaborn 代码和预处理数据集,使其格式正确,但没有运气。
Seaborn 不支持堆叠条形图,因此您需要绘制 cumsum:
# calculate the distribution of `Clicked` per `Rank`
distribution = pd.crosstab(df.Rank, df.Clicked, normalize='index')
# plot the cumsum, with reverse hue order
sns.barplot(data=distribution.cumsum(axis=1).stack().reset_index(name='Dist'),
x='Rank', y='Dist', hue='Clicked',
hue_order = distribution.columns[::-1], # reverse hue order so that the taller bars got plotted first
dodge=False)
输出:
最好,您还可以反转 cumsum 方向,那么您就不需要反转色调顺序:
sns.barplot(data=distribution.iloc[:,::-1].cumsum(axis=1) # we reverse cumsum direction here
.stack().reset_index(name='Dist'),
x='Rank', y='Dist', hue='Clicked',
hue_order=distribution.columns, # forward order
dodge=False)
输出:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.