如何基于含分类数据的Pandas DataFrame绘制百分比堆叠柱状图?
实现堆叠百分比柱状图的完整步骤
没问题,我来帮你搞定这个堆叠柱状图!你猜的没错,核心确实是先把数据处理成各列中每个层级的占比,然后再可视化。下面是一步步的具体操作:
1. 计算各列的层级占比
首先我们需要对DataFrame的每一列,统计每个层级(CL0/CL1/CL2/CL3)的出现比例。用Pandas的value_counts(normalize=True)可以直接得到比例,再通过转置让列名变成X轴的类别:
import pandas as pd # 假设你的DataFrame名为df # 对每列计算层级占比,转置后填充缺失值(避免某些列没有某个层级的情况),转成百分比 proportion_df = df.apply(lambda col: col.value_counts(normalize=True)).T.fillna(0) * 100
apply(lambda col: col.value_counts(normalize=True)):对每一列执行统计,normalize=True返回的是0-1之间的比例.T:转置结果,让原来的列(A/B/C/D)变成行索引,对应X轴的类别fillna(0):如果某列没有某个层级(比如列B里没有CL0),会出现NaN,用0填充保证后续画图正常*100:把比例转成百分比,更直观
2. 绘制堆叠柱状图
用Pandas自带的绘图接口结合Matplotlib就能轻松画出堆叠柱状图:
import matplotlib.pyplot as plt # 绘制堆叠柱状图 ax = proportion_df.plot(kind='bar', stacked=True, figsize=(10, 6)) # 美化图表 plt.title('Class Proportion by Column', fontsize=14) plt.xlabel('Columns (A/B/C/D)', fontsize=12) plt.ylabel('Percentage (%)', fontsize=12) plt.legend(title='Class Labels', bbox_to_anchor=(1.05, 1), loc='upper left') # 把图例放在图外,避免遮挡 plt.tight_layout() # 自动调整布局,防止标签被截断 plt.show()
stacked=True:这是实现堆叠效果的关键参数figsize:调整图表的宽高bbox_to_anchor:把图例移到图的右侧,避免覆盖柱子,让图表更清晰
示例测试(用你给的前3行数据)
如果用你提供的样本数据测试:
data = { 'A': ['CL0', 'CL2', 'CL3'], 'B': ['CL1', 'CL1', 'CL2'], 'C': ['CL2', 'CL1', 'CL0'], 'D': ['CL0', 'CL3', 'CL1'] } df = pd.DataFrame(data)
运行第一步的代码后,proportion_df会输出:
CL0 CL1 CL2 CL3 A 33.333333 0.000000 33.333333 33.333333 B 0.000000 66.666667 33.333333 0.000000 C 33.333333 33.333333 33.333333 0.000000 D 33.333333 33.333333 0.000000 33.333333
再运行绘图代码,就能得到完美的堆叠百分比柱状图啦!
内容的提问来源于stack exchange,提问作者user4824195
相关产品推荐
相关产品推荐

