Menambahkan legenda ke PyPlot di Matplotlib dengan cara sesederhana mungkin

263

TL; DR -> Bagaimana cara membuat legenda untuk grafik garis Matplotlibdi PyPlottanpa membuat variabel tambahan?

Silakan pertimbangkan skrip grafik di bawah ini:

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

Seperti yang Anda lihat, ini adalah penggunaan yang sangat dasar matplotlib's PyPlot. Idealnya ini menghasilkan grafik seperti di bawah ini:

Grafik

Tidak ada yang istimewa, saya tahu. Namun, tidak jelas data apa yang sedang diplot di mana (Saya mencoba memplot data dari beberapa algoritma pengurutan, panjang terhadap waktu yang dibutuhkan, dan saya ingin memastikan orang tahu baris mana yang mana). Jadi, saya butuh legenda, lihat contoh berikut di bawah ini ( dari situs resmi ):

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)

Anda akan melihat bahwa saya perlu membuat variabel tambahan ax. Bagaimana saya bisa menambahkan legenda ke grafik saya tanpa harus membuat variabel tambahan ini dan mempertahankan kesederhanaan skrip saya saat ini?

Game Brainiac
sumber
Saya bingung dengan kekhawatiran Anda membuat variabel tambahan. Anda harus tetap membuat objek-objek itu di belakang layar.
tacaswell
1
@tcaswell Baiklah saya coba meredakan mereka. Saya tidak ingin membuat variabel tambahan, karena menambah kompleksitas pada keseluruhan skrip. Saya mencoba mengajarkan ini kepada sekelompok siswa, dan karena mereka belum pernah menggunakan matplotlibsebelumnya, saya ingin menjaga hal-hal sesederhana mungkin. Juga, jika Anda melihat jawaban Rob, itu jauh lebih sederhana daripada contoh yang ditampilkan di situs web. Saya harap itu membantu.
Game Brainiac
1
Saya berpendapat bahwa menggunakan antarmuka mesin keadaan membuatnya lebih sulit untuk dipahami dalam jangka panjang karena begitu banyak yang dilakukan 'dengan sihir'. Juga, konvensi ini akan digunakan import matplotlib.pyplot as pltsebagai gantiPyPlot
tacaswell

Jawaban:

441

Tambahkan label=ke masing-masing plot()panggilan Anda , lalu panggil legend(loc='upper left').

Pertimbangkan contoh ini (diuji dengan Python 3.8.0):

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

masukkan deskripsi gambar di sini Sedikit dimodifikasi dari tutorial ini: http://jakevdp.github.io/mpl_tutorial/tutorial_pages/tut1.html

Robᵩ
sumber
2
Apakah ada cara untuk melakukan ini jika Anda tidak tahu label pada saat seri diplot? Apakah cara untuk menambahkan label ke seri setelah diplot? Atau mungkin cara untuk memodifikasi label placeholder sebelum menunjukkan legenda?
davidA
13
plt.legend(loc='upper left')juga berfungsi, dari mana pltberasal import matplotlib.pyplot as plt.
Matt Kleinsmith
Terima kasih, @eric, untuk memperhatikan ini. Saya telah memperbarui kodenya.
Robᵩ
Terpilih karena stack overflow luar biasa dan jawaban yang baik dapat berubah
eric
1
@davidA Ya, Anda dapat dengan mudah memberikan daftar string ke plt.legend:plt.legend(['First Label', 'Second Label'])
Apollys mendukung Monica
36

Anda dapat mengakses instance Axes ( ax) dengan plt.gca(). Dalam hal ini, Anda bisa menggunakan

plt.gca().legend()

Anda dapat melakukan ini dengan menggunakan label=kata kunci di setiap plt.plot()panggilan Anda atau dengan menetapkan label Anda sebagai tuple atau daftar di dalamnya legend, seperti dalam contoh ini:

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

Namun, jika Anda perlu untuk mengakses contoh Axes lebih bahwa sekali, saya sarankan menyimpannya ke variabel axdengan

ax = plt.gca()

dan kemudian memanggil axbukan plt.gca().

cameronroytaylor
sumber
salin-tempel jawaban yang tidak memerlukan bacaan, dan dengan gambar! jawaban ini layak mendapat pujian lebih banyak
Gulzar
14

Berikut ini contoh untuk membantu Anda ...

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

masukkan deskripsi gambar di sini

Akash Kandpal
sumber
2
Saya hanya ingin tahu, mengapa garis pas Anda begitu jauh dari data?
Apollys mendukung Monica
13

Plot sederhana untuk kurva sinus dan cosinus dengan legenda.

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

Sin and Cosine plot (klik untuk melihat gambar)

sajalagrawal
sumber
6

Tambahkan label ke setiap argumen dalam panggilan plot Anda yang sesuai dengan seri yang dibuatnya, yaitu label = "series 1"

Kemudian cukup tambahkan Pyplot.legend()ke bagian bawah skrip Anda dan legenda akan menampilkan label ini.

blaklaybul
sumber
Ini adalah ide yang tepat, tetapi Anda tidak pernah menambahkan label sehingga legenda akan kosong
tacaswell
4

Anda dapat menambahkan dokumentasi legenda khusus

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

masukkan deskripsi gambar di sini

Boris Yakubchik
sumber
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()
James Turner
sumber