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

使用matplotlib bar_label为DataFrame柱状图添加标签报错求助

解决pandas柱状图添加bar_label时的AttributeError错误

错误原因

原生matplotlib的plt.bar()绘图后返回的是BarContainer对象(包含柱状图的所有元素),而pandas的df.plot.bar()返回的是AxesSubplot对象(整个坐标轴实例)。plt.bar_label()要求接收BarContainer类型的容器,直接传入Axes对象就会触发'AxesSubplot' object has no attribute 'datavalues'错误。

另外你代码里的labels = "animals"参数也不正确,该参数需要传入具体的数值序列,而非列名字符串。

修正方案

从Axes对象中提取出BarContainer,再传给plt.bar_label(),同时正确设置labels参数(或省略该参数,让函数自动读取数据值)。

修正后的代码

import pandas as pd
import matplotlib.pyplot as plt

year_v2 = [1999, 2010, 2011]
animals_v2 = [400, 500, 100]

df_v2 = pd.DataFrame([year_v2, animals_v2], index=["year", "animals"]).T

# 用pandas绘图,得到Axes对象
barplot_v2 = df_v2.plot.bar("year",
                            "animals",
                            fc="lightgray",
                            ec="black")

# 从Axes的containers中取出第一个BarContainer(对应单组柱状图)
bar_container = barplot_v2.containers[0]

# 添加标签,可省略labels参数让它自动读取柱状图数值,也可指定df的列
plt.bar_label(container=bar_container,
              labels=df_v2["animals"],  # 可选参数,省略则自动使用柱子对应数值
              label_type="center")

plt.show()

补充说明

  • 如果是多组柱状图(比如DataFrame包含多个数值列),containers列表会对应多个BarContainer,按需选择即可。
  • plt.bar_label()的labels参数默认会使用BarContainer的datavalues,也就是柱子对应的数值,多数场景下无需手动传入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:05:21