Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 图例未显示在Matplotlib堆叠区域图中_Python_Numpy_Matplotlib - Fatal编程技术网

Python 图例未显示在Matplotlib堆叠区域图中

Python 图例未显示在Matplotlib堆叠区域图中,python,numpy,matplotlib,Python,Numpy,Matplotlib,我正在使用pyplot的方法创建一个堆叠的线/面积图,在尝试了这么多之后,我仍然无法理解为什么它没有显示任何图例或标签(即使我在代码中提供了它们)。代码如下: 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.arang

我正在使用pyplot的方法创建一个堆叠的线/面积图,在尝试了这么多之后,我仍然无法理解为什么它没有显示任何图例或标签(即使我在代码中提供了它们)。代码如下:

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()
以下是生成的图像(请注意,图例显示的是空框,而不是标签):

救命啊

使用
fill\u between()
命令创建了一个不受
legend()
命令支持的多集合

因此,您必须使用另一个matplotlib艺术家(与
legend()
兼容)作为代理,而无需将其添加到轴(这样代理艺术家将不会在主轴中绘制)并将其提供给legend函数。(有关更多详细信息,请参阅)

在您的情况下,下面的代码应该可以解决您的问题:

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])

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]))

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

plt.plot([], [], color='green', linewidth=10)
plt.plot([], [], color='red', linewidth=10)
如果图例也有其他数据标签,则此操作也很有效:


我只是想在寻找这件事的时候提供一个最新消息。2016年,PolyCollection已经为label属性提供了支持,如您所见:


我不在那里?很奇怪。还可以尝试将绘图指定到图例的参数中。还有地点。运气不好!:-/我试过这个,太棒了!!谢谢。:-)这解决了我的问题。我还研究了一个不同的黑客程序,即plt.text(color='color')位于绘图右上角,用于处理此异常,但您的答案正是中肯的。再次感谢。谢谢!。如果我们使用fill_-between,有没有类似的方法来设置标签?我以前使用过补丁,但由于某种原因它们停止了工作(或者它们在Mac上工作,但在Linux上不工作?)。但是这个矩形/标签组合确实有效,所以谢谢。到今天为止,这个答案已经过时,OP的代码将正确显示图例,请参见@Fernando Ferreira答案