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

