Легенда не появляется в участке сложенной площади Матплотлиба
Я создаю многострочный график линии/области, используя метод 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()
Вот изображение, сгенерированное (обратите внимание, что в легенде отображается пустое поле вместо меток):
![empty legend box at the top]()
Help!
Ответы
Ответ 1
Команда fill_between()
создает PolyCollection, которая не поддерживается командой legend()
.
Поэтому вам нужно будет использовать другого пользователя matplotlib (совместимого с legend()
) в качестве прокси-сервера, не добавляя его к осям (чтобы прокси-художник не рисовался в главных осях) и передал его функции легенды, (подробнее см. руководство по использованию matplotlib)
В вашем случае приведенный ниже код должен исправить вашу проблему:
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]()
Ответ 2
gcalmettes ответ был полезным началом, но я хотел, чтобы моя легенда забирала цвета, которые автоматически присваивал стек. Вот как я это сделал:
polys = pyplot.stackplot(x, y)
legendProxies = []
for poly in polys:
legendProxies.append(pyplot.Rectangle((0, 0), 1, 1, fc=poly.get_facecolor()[0]))
Ответ 3
Другой, возможно, более простой способ - построить пустой набор данных и использовать его запись легенды:
plt.plot([], [], color='green', linewidth=10)
plt.plot([], [], color='red', linewidth=10)
Это хорошо работает, если у вас есть другие метки данных для легенды:
![enter image description here]()
Ответ 4
Только для того, чтобы дать обновление по этому вопросу, поскольку я ищу его. В 2016 году PolyCollection уже обеспечивает поддержку атрибута метки, как вы можете видеть:
https://github.com/matplotlib/matplotlib/pull/3303#event-182205203