It seems your autolabel function autolabel expecting a list of patches , if you only use columns like patches , we could do:
df = pd.DataFrame({'score':np.random.randn(6), 'person':[x*3 for x in list('ABCDEF')]}) def autolabel(rects): x_pos = [rect.get_x() + rect.get_width()/2. for rect in rects] y_pos = [rect.get_y() + 1.05*rect.get_height() for rect in rects] #if height constant: hbars, vbars otherwise if (np.diff([plt.getp(item, 'width') for item in rects])==0).all(): scores = [plt.getp(item, 'height') for item in rects] else: scores = [plt.getp(item, 'width') for item in rects] # attach some text labels for rect, x, y, s in zip(rects, x_pos, y_pos, scores): ax.text(x, y, '%s'%s, ha='center', va='bottom') ax = df.set_index(['person']).plot(kind='barh', figsize=(10,7), color=['dodgerblue', 'slategray'], fontsize=13) ax.set_alpha(0.8) ax.set_title("BarH")#,fontsize=18) autolabel(ax.patches)

ax = df.set_index(['person']).plot(kind='bar', figsize=(10,7), color=['dodgerblue', 'slategray'], fontsize=13) ax.set_alpha(0.8) ax.set_title("Bar")#,fontsize=18) autolabel(ax.patches)

CT Zhu
source share