web-dev-qa-db-fra.com

Ajouter une légende à PyPlot dans Matplotlib de la manière la plus simple possible

TL; DR -> Comment créer une légende pour un graphe linéaire dans Matplotlib's PyPlot sans créer de variables supplémentaires?

Veuillez considérer le script graphique ci-dessous:

if __== '__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()

Comme vous pouvez le constater, il s’agit d’une utilisation très basique de matplotlib's PyPlot. Ceci génère idéalement un graphique comme celui ci-dessous:

Graph

Rien de spécial, je sais. Cependant, il est difficile de savoir quelles données sont tracées où (j'essaie de tracer les données de certains algorithmes de tri, longueur par rapport au temps pris, et j'aimerais m'assurer que les gens sachent quelle ligne est laquelle). Donc, j'ai besoin d'une légende, cependant, en regardant l'exemple suivant ci-dessous ( du site officiel ):

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)

Vous verrez que je dois créer une variable supplémentaire ax. Comment puis-je ajouter une légende à mon graphique sans avoir à créer cette variable supplémentaire et à conserver la simplicité de mon script actuel?.

192
Games Brainiac

Ajoutez un label= à chacun de vos plot() , puis appelez legend(loc='upper left') .

Considérez cet exemple:

import numpy as np
import pylab 
x = np.linspace(0, 20, 1000)
y1 = np.sin(x)
y2 = np.cos(x)

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

enter image description here Légèrement modifié depuis ce tutoriel: http://jakevdp.github.io/mpl_tutorial/tutorial_pages/tut1.html

316
Robᵩ

Vous pouvez accéder à l'instance Axes (ax) avec plt.gca(). Dans ce cas, vous pouvez utiliser

plt.gca().legend()

Vous pouvez le faire en utilisant le mot clé label= dans chacun de vos appels plt.plot() ou en affectant vos étiquettes sous forme de tuple ou de liste dans legend, comme dans cet exemple de travail:

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

Cependant, si vous devez accéder à l'instance Axes plusieurs fois, je vous recommande de l'enregistrer dans la variable ax avec

ax = plt.gca()

puis en appelant ax au lieu de plt.gca().

29
cameronroytaylor

Voici un exemple pour vous aider ...

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

enter image description here

11
Akash Kandpal

Un tracé simple pour les courbes sinus et cosinus avec une légende.

Utilisé 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 plots (click to view image)

9
sajalagrawal

Ajoutez des étiquettes à chaque argument de votre appel de tracé correspondant à la série représentée, c.-à-d. label = "series 1"

Ajoutez simplement Pyplot.legend() au bas de votre script et la légende affichera ces étiquettes.

6
blaklaybul

Vous pouvez ajouter une légende personnalisée documentation

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

enter image description here

1
Boris Yakubchik