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

如何用Pandas/Matplotlib绘制带百分比标注的0/1值水平堆叠条形图

实现百分比标注的堆叠水平条形图方案

你已有的代码已经完成了0、1占比的统计,只需补充遍历条形元素添加文本标注的逻辑即可,修改后可直接运行的完整代码如下:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

list_1 = [1,0,1,1,1,0,0,1,0,1,1,1,0,0,1,0,1,1,1,0,0,1,0,1,1,1,0,0,1,0,1,1,1,0,0,]
list_2 = [1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,1,0,]
list_3 = [1,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,1,1,0,0,]

df1 = pd.DataFrame({'Data1': list_1,'Data2': list_2,'Data3': list_3})

# 计算0和1的占比
ratio_1 = df1.mean()
ratio_0 = 1 - ratio_1
df = pd.concat([ratio_1.rename('1'), ratio_0.rename('0')], axis=1)

# 绘图并获取axes对象
ax = df.plot(kind='barh', stacked=True, figsize=(8, 4))

# 遍历所有条形块添加百分比标注
for patch in ax.patches:
    width = patch.get_width()
    # 跳过宽度极小的无效块(如果有的话)
    if width < 0.01:
        continue
    # 计算标注的中心位置
    x_pos = patch.get_x() + width / 2
    y_pos = patch.get_y() + patch.get_height() / 2
    # 添加文本,白色加粗字体更醒目
    ax.text(x_pos, y_pos, f'{width*100:.1f}%', 
            va='center', ha='center', 
            color='white', fontweight='bold')

# 可选美化配置
ax.set_xlabel('占比')
ax.set_ylabel('数据组')
ax.legend(title='数值类别')
plt.xlim(0, 1.05) # 拓宽x轴边界避免边缘标注被截断

plt.show()

代码修改说明

  • 保留了你原有的占比计算逻辑,优化了DataFrame拼接的写法更简洁
  • 接收df.plot()返回的axes对象,用于获取所有绘制完成的条形元素
  • 遍历每个条形块(ax.patches),自动计算每个分段的中心位置添加百分比标注
  • 补充了基础美化配置,你可以根据需要调整颜色、字体、数值保留位数等参数

内容的提问来源于stack exchange,提问作者Jerzy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:15:04