Matplotlib Legends не працює


96

З моменту оновлення 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()

Я знайшов посилання, що помилка вказує мені на досить марну діагностику джерела помилки.

Відповіді:


164

Вам слід додати коми:

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

рядок, = ділянка (х, гріх (х)) що означає кома?


2
Ви можете скопіювати / додати пояснення сюди? stackoverflow заохочує копіювати відповідні частини на місці (виділення, архівування)
n611x007

16

Використовуйте ключове слово "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()

-1

використовувати мітку під час побудови графіку, тоді лише u може використовувати легенду. Назва осі x та назва осі y відрізняється від назви легенди.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.