如何在Matplotlib直方图添加条形标签?FIFA19数据集报错求助
解决Matplotlib直方图添加标签时的AttributeError问题
错误原因
plt.hist()函数返回的是一个三元组:(n, bins, patches),其中:
n:每个得分区间内的球员数量数组bins:得分区间的边界值数组patches:构成直方图的所有柱子对象集合
触发AttributeError: 'tuple' object has no attribute 'patches'的原因是你直接把整个返回的元组当成柱子对象调用.patches属性,而元组本身没有这个属性。
修复后的完整代码示例
import pandas as pd import matplotlib.pyplot as plt # 读取本地FIFA19数据集CSV文件 df = pd.read_csv("fifa19.csv") # 替换为你的本地文件路径 # 提取技能得分列(示例用Overall总评得分,可替换为你需要的技能列) skill_scores = df["Overall"] # 绘制直方图并解包返回的元组 counts, bins, patches = plt.hist(skill_scores, bins=12) # bins参数可按需调整区间数量 # 为每个柱子添加数量标签 for patch, count in zip(patches, counts): # 计算标签的位置:柱子水平居中,垂直在柱子顶部上方 x_pos = patch.get_x() + patch.get_width() / 2 y_pos = patch.get_height() + 0.5 # +0.5避免标签和柱子重叠 # 添加文本标签 plt.text(x_pos, y_pos, int(count), ha="center", va="bottom") # 设置图表基础信息 plt.xlabel("技能得分区间") plt.ylabel("球员数量") plt.title("FIFA19球员技能得分分布") plt.show()
关键逻辑解释
- 元组解包:必须把
plt.hist()的返回值拆分成三个变量,单独拿到patches(柱子对象)和counts(区间数量),才能遍历配对添加标签。 - 标签位置计算:
patch.get_x()获取柱子左边缘x坐标,加上柱子宽度的一半实现水平居中patch.get_height()获取柱子高度,加一个小偏移量让标签显示在柱子上方,避免重叠ha="center"和va="bottom"确保标签在目标位置对齐
- 数据类型处理:把
count转成整数,因为球员数量是整数,显示更直观
内容的提问来源于stack exchange,提问作者David Eler
相关产品推荐
相关产品推荐

