如何用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
相关产品推荐
相关产品推荐

