Matplotlib Legends çalışmıyor


99

Matplotlib'i yükselttiğimden beri, bir efsane yaratmaya çalıştığımda şu hatayı alıyorum:

/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),))

Bu, bunun gibi önemsiz bir komut dosyasıyla bile ortaya çıkar:

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

Hatanın kaynağını teşhis etmede hatanın beni oldukça yararsız gösterdiği bağlantıyı buldum.

Yanıtlar:


170

Virgül eklemelisiniz:

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

Virgüllere ihtiyaç duymanızın nedeni, plt.plot () işlevinin, komuttan gerçekte kaç tane yaratılmış olursa olsun, bir satır nesnesi demeti döndürmesidir. Virgül olmadan, "plot1" ve "plot2" satır nesneleri yerine tupllardır ve plt.legend () 'e yapılan sonraki çağrı başarısız olur.

Virgül, sonuçları örtük olarak ayırır, böylece bir demet yerine, "plot1" ve "plot2" otomatik olarak demetteki ilk nesneler, yani gerçekte istediğiniz satır nesneleri olur.

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

line, = plot (x, sin (x)) virgül ne anlama geliyor?


2
açıklamayı buraya kopyalayabilir / ekleyebilir misiniz? stackoverflow, ilgili parçaları yerinde kopyalamayı teşvik eder (vurgulama, arşivleme)
n611x007

20

"Etiket" anahtar kelimesini şu şekilde kullanın:

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

ve sonra efsaneyi şöyle ekleyin:

pyplot.legend()

Gösterge, kalınlık, renkler vb. Gibi çizgi özelliklerini koruyacaktır.

görüntü açıklamasını buraya girin


9

handlesAKA kullanProxy 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

Grafiği çizerken etiketi kullanın, o zaman sadece u gösterge kullanabilir. x ekseni adı ve y ekseni adı, gösterge adından farklı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.