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

matplotlib 3.3.1版本为条形图添加数值标签出现TypeError如何解决

报错原因

TypeError: 'numpy.ndarray' object is not callable 错误的核心触发原因是:dict_df[plot]为Pandas Series对象,其values是属性而非方法,代码中加了括号写作values()相当于将返回的numpy数组当作函数调用,触发类型错误。除此之外,原有标注代码还存在两个问题:

  1. 水平条形图的坐标参数写反,annotate的xy参数首位为x轴(数值维度)、次位为y轴(分类维度),原有写法将分类索引放在x位、数值放在y位,即使解决类型错误也无法正常显示标签
  2. 原有绘图代码直接对sns.barplot返回值调用set_title赋值给ax,会导致ax被赋值为None,无法调用Axes对象的相关方法
修正方案

推荐使用matplotlib 3.4及以上版本自带的bar_label方法实现,代码更简洁不易出错,完整的循环代码如下:

for i, plot in enumerate(dict_df.keys()):
    plt.figure(i)
    # 先保存Axes对象,再单独设置标题
    ax = sns.barplot(y = 'group', x = 'mix', 
                    data = dict_df[plot].reset_index(), 
                    orient = 'h')
    ax.set_title(plot)
    
    # 为所有条形添加数值标签,padding控制标签与条形末端的间距
    for container in ax.containers:
        ax.bar_label(container, padding=3, fmt='%.2f')
    
    plt.savefig(rf'Folder\{plot}')
    plt.close() # 避免批量绘图时内存溢出

如果需要兼容旧版本matplotlib,可将添加标签的部分替换为annotate的正确写法:

df = dict_df[plot].reset_index()
for idx, row in df.iterrows():
    ax.annotate(f"{row['mix']:.2f}", 
                xy=(row['mix'], idx),
                xytext=(3, 0), # 标签向右偏移3个像素
                textcoords='offset points',
                va='center')

内容的提问来源于stack exchange,提问作者Jonas Palačionis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:18:04