我正在使用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()
以下是生成的图像(请注意,图例显示空框而不是标签):
帮助!
答案 0 :(得分:39)
fill_between()
命令创建legend()
命令不支持的PolyCollection。
因此,您必须使用另一个matplotlib艺术家(与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])
答案 1 :(得分:19)
gcalmettes的答案是一个有用的开始,但我希望我的图例能够获取stackplot自动分配的颜色。我是这样做的:
polys = pyplot.stackplot(x, y)
legendProxies = []
for poly in polys:
legendProxies.append(pyplot.Rectangle((0, 0), 1, 1, fc=poly.get_facecolor()[0]))
答案 2 :(得分:17)
另一种可以说更容易的技术是绘制一个空数据集,并使用它的图例条目:
plt.plot([], [], color='green', linewidth=10)
plt.plot([], [], color='red', linewidth=10)
如果您有图例的其他数据标签,这也很有效:
答案 3 :(得分:4)
仅在我寻找时才提供有关此事的最新信息。在2016年,PolyCollection已经为label属性提供了支持,如您所见:
https://github.com/matplotlib/matplotlib/pull/3303#event-182205203