You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于含分类数据的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:28:18