如何高效绘制按hue分组的堆叠柱状计数图?
实现Seaborn堆叠计数图的简便方法
嘿,我太懂你想要的效果了——默认的sns.countplot用hue参数时确实是并列展示分组计数,要改成堆叠来快速对比总计的话,不用折腾复杂的自定义聚合,有两种更简洁的实现方式:
方法1:用Matplotlib的bottom参数手动堆叠(兼容所有Seaborn版本)
先通过交叉表统计好各组的计数,再循环用Matplotlib的bar函数,利用bottom参数实现堆叠,同时可以复用Seaborn的调色板保持风格一致:
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd # 加载泰坦尼克数据集 df = sns.load_dataset('titanic') # 生成交叉表,得到[survived, class]对应的计数矩阵 counts = pd.crosstab(df['survived'], df['class']) # 调用Seaborn默认调色板,保证和countplot风格统一 colors = sns.color_palette() # 初始化bottom数组,用于记录每一层柱子的底部位置 bottom = [0, 0] # 循环每个舱位等级,绘制堆叠柱状图 for idx, cls in enumerate(counts.columns): plt.bar( x=counts.index, height=counts[cls], bottom=bottom, color=colors[idx], label=cls ) # 更新bottom,把当前层的计数加到下一层的底部 bottom += counts[cls].values # 美化图表细节 plt.xlabel('Survived') plt.ylabel('Total Count') plt.title('Stacked Survival Count by Passenger Class') plt.legend(title='Passenger Class') plt.xticks(ticks=[0, 1], labels=['Did Not Survive', 'Survived']) plt.show()
方法2:用Seaborn的histplot快速实现(Seaborn 0.11+版本支持)
Seaborn从0.11版本开始,histplot新增了multiple参数,直接设置multiple="stack"就能实现堆叠效果,比手动堆叠更省心:
import seaborn as sns import matplotlib.pyplot as plt df = sns.load_dataset('titanic') # 使用histplot,设置stat="count"确保统计计数,multiple="stack"开启堆叠 sns.histplot( data=df, x='survived', hue='class', multiple='stack', stat='count', shrink=0.8 # 调整柱子宽度,和countplot的视觉效果更接近 ) # 调整图表标签和刻度 plt.xlabel('Survived') plt.ylabel('Total Count') plt.title('Stacked Survival Count by Passenger Class') plt.xticks(ticks=[0, 1], labels=['Did Not Survive', 'Survived']) plt.show()
这个方法本质是用histplot模拟countplot的计数功能,同时借助multiple参数实现堆叠,代码量少很多,而且完全贴合Seaborn的使用习惯。
内容的提问来源于stack exchange,提问作者Marcello
相关产品推荐
相关产品推荐

