matplotlib 3.3.1版本为条形图添加数值标签出现TypeError如何解决
报错原因
TypeError: 'numpy.ndarray' object is not callable 错误的核心触发原因是:dict_df[plot]为Pandas Series对象,其values是属性而非方法,代码中加了括号写作values()相当于将返回的numpy数组当作函数调用,触发类型错误。除此之外,原有标注代码还存在两个问题:
- 水平条形图的坐标参数写反,
annotate的xy参数首位为x轴(数值维度)、次位为y轴(分类维度),原有写法将分类索引放在x位、数值放在y位,即使解决类型错误也无法正常显示标签 - 原有绘图代码直接对
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
相关产品推荐
相关产品推荐

