如何利用DataFrame列给Matplotlib柱状图分段添加内部标签?
实现单根堆叠柱状图的分段内部标签
我明白你想要的效果——在单根堆叠柱状图的每个分段内部显示对应的aa1到aa5列标签,而且之前手动调整标签位置总是达不到理想效果对吧?下面给你一套结合Pandas和Matplotlib的可行方案,完全贴合你的需求:
步骤1:准备示例数据
先模拟一个和你结构类似的DataFrame,方便演示:
import pandas as pd import matplotlib.pyplot as plt # 构造示例数据 data = { 'aa1': [30], 'aa2': [25], 'aa3': [20], 'aa4': [15], 'aa5': [10] } df = pd.DataFrame(data)
步骤2:绘制堆叠柱状图并添加内部标签
核心思路是通过循环逐个绘制每个分段,同时自动计算标签的居中位置,避免手动调整的误差:
plt.figure(figsize=(6, 8)) # 选中aa1到aa5列 segments = df.loc[:, 'aa1':'aa5'] # 初始化堆叠的底部位置 bottom = 0 x = 0 # 单根柱子的x坐标 # 循环每个分段,绘制柱子并添加标签 for col, value in segments.items(): value = value.iloc[0] # 取出单根柱子的分段数值 # 绘制当前分段的柱子 plt.bar(x, value, bottom=bottom, label=col) # 计算标签的y坐标:底部位置 + 分段高度的一半(确保居中) label_y = bottom + value / 2 # 添加内部标签,设置字体样式 plt.text(x, label_y, f'{col}\n({value})', ha='center', va='center', fontsize=10, color='white') # 更新底部位置,为下一个分段做准备 bottom += value # 调整图表样式 plt.xticks([x], ['总数据']) # 设置x轴刻度 plt.ylabel('数值') plt.title('单根堆叠柱状图带内部分段标签') plt.legend(loc='upper right') plt.tight_layout() plt.show()
关键细节说明
- 用
bottom变量自动追踪每个分段的起始位置,确保堆叠顺序正确,同时标签的y坐标计算完全基于这个变量,避免手动估算的偏差 plt.text()的ha='center'和va='center'确保标签在分段内水平和垂直都居中- 标签里可以同时显示列名和数值(比如
f'{col}\n({value})'),如果只需要列名,直接用col即可
这个方案完全不需要手动调整位置,所有坐标都是基于数据自动计算的,不管你的aa1到aa5数值怎么变,标签都会自动居中在对应分段里。
内容的提问来源于stack exchange,提问作者Dawid
相关产品推荐
相关产品推荐

