matplotlib 图例显示 "Container object of 10 artists" 而不是标签

matplotlib legend shows "Container object of 10 artists" instead of label

下面的代码可以正确生成绘图和图例,但是图例不会显示指定的 label 文本,而是显示 "Container object of 10 artists"。

ax = plt.subplot(212)

plt.tight_layout()

l1= plt.bar(X+0.25, Y1, 0.45, align='center', color='r', label='A', edgecolor='black', hatch="/")
l2= plt.bar(X,      Y2, 0.45, align='center', color='b', label='N',hatch='o', fill=False)

ax.autoscale(tight=True)

plt.xticks(X, X_values)

ymax1 = max(Y1) + 1
ymax2 = max(Y2) + 1

ymax = max(ymax1,ymax2)+1
plt.ylim(0, ymax)

plt.grid(True)

plt.legend([l1,l2], loc='upper right', prop={'size':20})

输出如下图:

如何在图例上正确显示每个条形图的标签(如 plt.bar() 函数中指定的那样)?

问题源于混合使用 plt.legend() 的两种方法。您有两个选择:

  1. 手动指定图例的标签
  2. 使用 ax.get_legend_handles_labels() 填写您传递给 plt.bar()
  3. label 参数

要手动指定标签,请将它们作为第二个参数传递给您对 plt.legend() 的调用,如下所示:

plt.legend([l1,l2], ["A", "N"], loc='upper right', prop={'size':20})

如果您想自动填充图例,您可以使用以下方法在图中查找可图例对象及其标签:

handles, labels = ax.get_legend_handles_labels()
ax.legend(handles, labels, loc='upper right', prop={'size':20})