Matplotlib Legends не работает

98

С момента обновления matplotlib я получаю следующую ошибку при попытке создать легенду:

/usr/lib/pymodules/python2.7/matplotlib/legend.py:610: UserWarning: Legend does not support [<matplotlib.lines.Line2D object at 0x3a30810>]
Use proxy artist instead.

http://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist

  warnings.warn("Legend does not support %s\nUse proxy artist instead.\n\nhttp://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist\n" % (str(orig_handle),))
/usr/lib/pymodules/python2.7/matplotlib/legend.py:610: UserWarning: Legend does not support [<matplotlib.lines.Line2D object at 0x3a30990>]
Use proxy artist instead.

http://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist

  warnings.warn("Legend does not support %s\nUse proxy artist instead.\n\nhttp://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist\n" % (str(orig_handle),))

Это происходит даже с таким тривиальным скриптом:

import matplotlib.pyplot as plt

a = [1,2,3]
b = [4,5,6]
c = [7,8,9]

plot1 = plt.plot(a,b)
plot2 = plt.plot(a,c)

plt.legend([plot1,plot2],["plot 1", "plot 2"])
plt.show()

Я нашел ссылку, указывающую на то, что ошибка указывает на бесполезность в диагностике источника ошибки.

Майк Велла
источник

Ответы:

168

Вы должны добавить запятые:

plot1, = plt.plot(a,b)
plot2, = plt.plot(a,c)

Причина, по которой вам нужны запятые, заключается в том, что plt.plot () возвращает кортеж строковых объектов, независимо от того, сколько фактически создано из команды. Без запятой «plot1» и «plot2» являются кортежами, а не строковыми объектами, что приводит к сбою последующего вызова plt.legend ().

Запятая неявно распаковывает результаты, так что вместо кортежа "plot1" и "plot2" автоматически становятся первыми объектами в кортеже, то есть строковыми объектами, которые вам действительно нужны.

http://matplotlib.sourceforge.net/users/legend_guide.html#adjusting-the-order-of-legend-items

line, = plot (x, sin (x)) что означает запятая?

Applicative_functor
источник
2
не могли бы вы скопировать / добавить здесь объяснение? stackoverflow поощряет копирование соответствующих частей на сайт (выделение, архивирование)
n611x007
помогло мне, спасибо
abdoulsn
20

Используйте ключевое слово "label", например:

pyplot.plot(x, y, label='x vs. y')

а затем добавьте легенду так:

pyplot.legend()

В легенде сохранятся такие свойства линии, как толщина, цвета и т. Д.

введите описание изображения здесь

Ицен де Бур
источник
9

Использовать handlesAKAProxy artists

import matplotlib.lines as mlines
import matplotlib.pyplot as plt
# defining legend style and data
blue_line = mlines.Line2D([], [], color='blue', label='My Label')
reds_line = mlines.Line2D([], [], color='red', label='My Othes')

plt.legend(handles=[blue_line, reds_line])

plt.show()
ppaulojr
источник
-1

используйте метку при построении графика, тогда только вы можете использовать легенду. Имя оси x и имя оси Y отличается от имени легенды.

Java Автор Kiran
источник