Agregar una leyenda a PyPlot en Matplotlib de la manera más simple posible

TL; DR -> ¿Cómo se puede crear una leyenda para un gráfico de líneas en PyPlot Matplotlib sin crear ninguna variable adicional?

Por favor, considere el siguiente guión gráfico:

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

Como puede ver, este es un uso muy básico de matplotlib de PyPlot . Esto idealmente genera un gráfico como el siguiente:

Grafico

Nada especial, lo sé. Sin embargo, no está claro qué datos se están graficando dónde (estoy tratando de trazar los datos de algunos algoritmos de clasificación, la longitud en función del tiempo tomado, y me gustaría asegurarme de que la gente sepa qué línea es cuál). Por lo tanto, necesito una leyenda, sin embargo, mirando el siguiente ejemplo a continuación ( desde el sitio oficial ):

 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) 

Verás que necesito crear un ax variable adicional. ¿Cómo puedo agregar una leyenda a mi gráfico sin tener que crear esta variable adicional y conservar la simplicidad de mi script actual?

Agregue una label= a cada una de sus llamadas de plot() , y luego llame a la legend(loc='upper left') .

Considere esta muestra:

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

introduzca la descripción de la imagen aquí Modificado ligeramente de este tutorial: http://jakevdp.github.io/mpl_tutorial/tutorial_pages/tut1.html

Puede acceder a la instancia de Axes ( ax ) con plt.gca() . En este caso, puede utilizar

 plt.gca().legend() 

Puede hacer esto usando la palabra clave label= en cada una de sus llamadas plt.plot() o asignando sus tags como una tupla o lista dentro de la legend , como en este ejemplo de trabajo:

 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

Sin embargo, si necesita acceder a la instancia de Ejes más de una vez, le recomiendo que la guarde en la variable ax con

 ax = plt.gca() 

y luego llamando ax lugar de plt.gca() .

Aquí hay un ejemplo para ayudarte …

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

introduzca la descripción de la imagen aquí

Una ttwig simple para curvas sinusoidales y coseno con una leyenda.

matplotlib.pyplot usado

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

Parcelas de pecado y coseno (click para ver imagen)

Agregue tags a cada argumento en su llamada de trazado correspondiente a la serie que está graficando, es decir, label = "series 1"

Luego simplemente agregue Pyplot.legend() al final de su script y la leyenda mostrará estas tags.