Matplotlib'deki PyPlot'a mümkün olan en basit şekilde bir açıklama ekleme


264

TL; DR -> İnsan nasıl bir çizgi grafik için bir açıklama oluşturmak olabilir Matplotlib's PyPlotherhangi bir ekstra değişkenleri yaratmadan?

Lütfen aşağıdaki grafik komut dosyasını göz önünde bulundurun:

if __name__ == '__main__':
    PyPlot.plot(total_lengths, sort_times_bubble, 'b-',
                total_lengths, sort_times_ins, 'r-',
                total_lengths, sort_times_merge_r, 'g+',
                total_lengths, sort_times_merge_i, 'p-', )
    PyPlot.title("Combined Statistics")
    PyPlot.xlabel("Length of list (number)")
    PyPlot.ylabel("Time taken (seconds)")
    PyPlot.show()

Gördüğünüz gibi, bu bir çok temel kullanımıdır matplotlib's PyPlot. Bu ideal olarak aşağıdaki gibi bir grafik oluşturur:

grafik

Özel bir şey yok, biliyorum. Ancak, hangi verilerin nerede çizildiği belirsizdir (bazı sıralama algoritmalarının verilerini, alınan süreye karşı uzunluğu çizmeye çalışıyorum ve insanların hangi satırın hangisi olduğunu bildiğinden emin olmak istiyorum). Bu nedenle, bir efsaneye ihtiyacım var, ancak aşağıdaki örneğe ( resmi siteden ) bir göz atacağım :

ax = subplot(1,1,1)
p1, = ax.plot([1,2,3], label="line 1")
p2, = ax.plot([3,2,1], label="line 2")
p3, = ax.plot([2,3,1], label="line 3")

handles, labels = ax.get_legend_handles_labels()

# reverse the order
ax.legend(handles[::-1], labels[::-1])

# or sort them by labels
import operator
hl = sorted(zip(handles, labels),
            key=operator.itemgetter(1))
handles2, labels2 = zip(*hl)

ax.legend(handles2, labels2)

Fazladan bir değişken oluşturmam gerektiğini göreceksiniz ax. Bu ekstra değişkeni yaratmak ve mevcut komut dosyamın sadeliğini korumak zorunda kalmadan grafiğime bir açıklama ekleyebilirim ?


Fazladan değişken yaratma konusundaki kaygınız beni şaşırttı. Zaten bu nesneleri perde arkasında yapmak zorundasınız.
tacaswell

1
@tcaswell Peki onlara yardım etmeye çalışayım. Ekstra değişkenler oluşturmak istemiyorum, çünkü tüm betiğe karmaşıklık katıyor. Bunu bir grup öğrenciye öğretmeye çalışıyorum ve daha matplotlibönce kullanmadığı için işleri olabildiğince basit tutmak istedim. Ayrıca, Rob'un cevabına bir göz atarsanız, web sitesinde gösterilen örnekten çok daha basittir. Umarım bu yardımcı olur.
Oyunlar Brainiac

1
Durum makine arayüzünü kullanmanın uzun vadede anlaşılmasını zorlaştırdığını , çünkü çoğunun 'sihirle' yapıldığını iddia ediyorum . Ayrıca, sözleşme import matplotlib.pyplot as pltyerine kullanmaktırPyPlot
tacaswell

Yanıtlar:


444

Bir ekleme label=senin her birine plot()aramalar ve sonra diyoruz legend(loc='upper left').

Bu örneği düşünün (Python 3.8.0 ile test edilmiştir):

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 20, 1000)
y1 = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y1, "-b", label="sine")
plt.plot(x, y2, "-r", label="cosine")
plt.legend(loc="upper left")
plt.ylim(-1.5, 2.0)
plt.show()

resim açıklamasını buraya girin Bu öğreticiden biraz değiştirilmiş: http://jakevdp.github.io/mpl_tutorial/tutorial_pages/tut1.html


2
Serinin çizildiği sırada etiketleri bilmiyorsanız bunu yapmanın bir yolu var mı? Yani bir seriye zaten çizildikten sonra etiket eklemenin bir yolu var mı? Veya göstergeyi göstermeden önce yer tutucu etiketleri değiştirmenin bir yolu olabilir mi?
davidA

13
plt.legend(loc='upper left')nerede ayrıca, çalışır pltarasındadır import matplotlib.pyplot as plt.
Matt Kleinsmith

@Eric, bunu kaydettiğiniz için teşekkürler. Kodu güncelledim.
Robᵩ

Yığın taşması harika olduğu ve iyi yanıtların değişebileceği için kaldırıldı
eric

1
Evet, basitçe bir dize listesi aktarabilirsiniz plt.legend:plt.legend(['First Label', 'Second Label'])
Apollys Monica

36

İle Axes örneğine ( ax) erişebilirsiniz plt.gca(). Bu durumda,

plt.gca().legend()

Bunu, aramalarınızın label=her birinde anahtar kelimeyi kullanarak plt.plot()veya etiketlerinizi legendbu çalışma örneğinde olduğu gibi bir demet veya liste olarak atayarak yapabilirsiniz :

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-0.75,1,100)
y0 = np.exp(2 + 3*x - 7*x**3)
y1 = 7-4*np.sin(4*x)
plt.plot(x,y0,x,y1)
plt.gca().legend(('y0','y1'))
plt.show()

pltGcaLegend

Bunu bir kez daha eksenleri örneğine erişmek için gereken Ancak, ben değişkene kaydederek tavsiye edersiniz axile

ax = plt.gca()

ve sonra axyerine çağırıyor plt.gca().


herhangi bir okuma gerektirmeyen kopyala yapıştır cevabı ve bir resim ile! Bu cevap daha fazla krediyi hak ediyor
Gulzar

14

İşte size yardımcı olacak bir örnek ...

fig = plt.figure(figsize=(10,5))
ax = fig.add_subplot(111)
ax.set_title('ADR vs Rating (CS:GO)')
ax.scatter(x=data[:,0],y=data[:,1],label='Data')
plt.plot(data[:,0], m*data[:,0] + b,color='red',label='Our Fitting 
Line')
ax.set_xlabel('ADR')
ax.set_ylabel('Rating')
ax.legend(loc='best')
plt.show()

resim açıklamasını buraya girin


2
Sadece merak ediyorum, bağlantı hattınız neden bu kadar veri dışında?
Apollys,

13

Bir efsane ile sinüs ve kosinüs eğrileri için basit bir arsa.

Kullanılmış matplotlib.pyplot

import math
import matplotlib.pyplot as plt
x=[]
for i in range(-314,314):
    x.append(i/100)
ysin=[math.sin(i) for i in x]
ycos=[math.cos(i) for i in x]
plt.plot(x,ysin,label='sin(x)')  #specify label for the corresponding curve
plt.plot(x,ycos,label='cos(x)')
plt.xticks([-3.14,-1.57,0,1.57,3.14],['-$\pi$','-$\pi$/2',0,'$\pi$/2','$\pi$'])
plt.legend()
plt.show()

Günah ve Kosinüs arazileri (resmi görebilmek için)


6

Grafik çağrınızdaki her bir bağımsız değişkene, çizdiği diziye karşılık gelen etiketler ekleyin; label = "series 1"

Sonra Pyplot.legend()komut dosyanızın altına ekleyin ve gösterge bu etiketleri gösterecektir.


Bu doğru fikir, ancak etiketleri asla eklemezsiniz, böylece efsane boş olacaktır
tacaswell

4

Özel bir gösterge belgeleri ekleyebilirsiniz

first = [1, 2, 4, 5, 4]
second = [3, 4, 2, 2, 3]
plt.plot(first,'g--', second, 'r--')
plt.legend(['First List','Second List'], loc='upper left')
plt.show()

resim açıklamasını buraya girin


0
    # Dependencies
    import numpy as np
    import matplotlib.pyplot as plt

    #Set Axes
    # Set x axis to numerical value for month
    x_axis_data = np.arange(1,13,1)
    x_axis_data

    # Average weather temp
    points = [39, 42, 51, 62, 72, 82, 86, 84, 77, 65, 55, 44]

    # Plot the line
    plt.plot(x_axis_data, points)
    plt.show()

    # Convert to Celsius C = (F-32) * 0.56
    points_C = [round((x-32) * 0.56,2) for x in points]
    points_C

    # Plot using Celsius
    plt.plot(x_axis_data, points_C)
    plt.show()

    # Plot both on the same chart
    plt.plot(x_axis_data, points)
    plt.plot(x_axis_data, points_C)

    #Line colors
    plt.plot(x_axis_data, points, "-b", label="F")
    plt.plot(x_axis_data, points_C, "-r", label="C")

    #locate legend
    plt.legend(loc="upper left")
    plt.show()
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.