Подтвердить что ты не робот

Легенда не появляется в участке сложенной площади Матплотлиба

Я создаю многострочный график линии/области, используя метод 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!

4b9b3361

Ответ 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