Matplotlib堆叠面积图中的图例未显示出来

28

我正在使用pyplot的plt.fill_between()方法创建一个堆叠的折线/面积图,经过尝试了很多方法,我仍然不能弄清楚为什么它不显示任何图例或标签(即使在代码中提供了它们)。下面是代码:

import matplotlib.pyplot as plt
import numpy

a1_label = 'record a1'
a2_label = 'record a2'

a1 = numpy.linspace(0,100,40)
a2 = numpy.linspace(30,100,40)

x = numpy.arange(0, len(a1), 1)

plt.fill_between(x, 0, a1, facecolor='green')
plt.fill_between(x, a1, a2, facecolor='red')
plt.title('some title')
plt.grid('on')
plt.legend([a1_label, a2_label])
plt.show()

这里是生成的图片(请注意,图例显示为空白框而不是标签):顶部空白图例框

救命啊!


我不在那里?相当奇怪。尝试将图形分配到图例参数中,以及位置。 - user1181445
没成功!:-/ 我试过这个东西。 - khan
4个回答

41
fill_between() 命令创建的 PolyCollection 不被 legend() 命令支持。因此,您需要使用另一个 matplotlib 图形对象作为代理(与 legend() 兼容),但不将其添加到轴中(因此代理图形对象不会在主轴中绘制),并将其提供给 legend 函数。(有关更多详细信息,请参见 matplotlib legend guide)在您的情况下,下面的代码应该解决您的问题:
from matplotlib.patches import Rectangle

p1 = Rectangle((0, 0), 1, 1, fc="green")
p2 = Rectangle((0, 0), 1, 1, fc="red")
legend([p1, p2], [a1_label, a2_label])

image


1
太好了!谢谢。 :-) 这解决了我的问题。我也在寻找一种方法,但是不同的是在图表的右上角使用plt.text(color='color')来处理这个异常,但是你的答案恰到好处。再次感谢。 - khan
谢谢!如果我们使用fill_between,是否有类似的设置标签的方法? - mclafee
我之前使用的是补丁,但由于某些原因它们停止工作了(或者它们在Mac上可以工作,但在Linux上不行?)。但这个矩形/标签组合确实有效,所以谢谢。 - Neil Traft
截至今天,这个答案已经过时了,而且OP的代码将正确显示图例,例如@Fernando Ferreira的答案。 - Davide Fiocco

19

gcalmettes的回答是一个很好的开始,但我想让我的图例拾取堆积图自动分配的颜色。这是我的做法:

polys = pyplot.stackplot(x, y)
legendProxies = []
for poly in polys:
    legendProxies.append(pyplot.Rectangle((0, 0), 1, 1, fc=poly.get_facecolor()[0]))

18

另一种可能更容易的技巧是绘制一个空数据集,并使用它的图例项:

另一种可能更为简单的技术是绘制一个空数据集,并利用其图例条目:

plt.plot([], [], color='green', linewidth=10)
plt.plot([], [], color='red', linewidth=10)

如果您的图例还有其他数据标签,这将非常有效:

enter image description here


4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接