Agregar una leyenda de matplotlib

6 minutos de lectura

Juegos Avatar de usuario de Brainiac
Juegos Brainiac

¿Cómo se puede crear una leyenda para un gráfico de líneas en Matplotlib‘s PyPlot sin crear ninguna variable extra?

Por favor, considere el script gráfico a continuación:

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‘s PyPlot. Idealmente, esto genera un gráfico como el siguiente:

Grafico

Nada especial, lo sé. Sin embargo, no está claro qué datos se trazan dónde (estoy tratando de trazar los datos de algunos algoritmos de clasificación, la duración frente al tiempo empleado, y me gustaría asegurarme de que la gente sepa qué línea es cuál). Por lo tanto, necesito una leyenda, sin embargo, echando un vistazo al siguiente ejemplo a continuación (del 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 una variable extra ax. ¿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?

  • Estoy confundido por su preocupación de crear una variable adicional. Tienes que hacer esos objetos detrás de escena de todos modos.

    – tacoswell

    1 oct 2013 a las 21:01

  • @tcaswell Bueno, déjame tratar de calmarlos. No quiero crear variables adicionales, porque agrega complejidad a todo el script. Estoy tratando de enseñar esto a un grupo de estudiantes, y dado que no han usado matplotlib antes, quería mantener las cosas lo más simples posible. Además, si observa la respuesta de Rob, es mucho más simple que el ejemplo que se muestra en el sitio web. Espero que eso ayude.

    – Juegos Brainiac

    1 oct 2013 a las 21:08


  • Yo diría que el uso de la interfaz de la máquina de estado hace que sea más difícil entender a largo plazo porque mucho de esto se está haciendo ‘por arte de magia’. Además, la convención es usar import matplotlib.pyplot as plt en lugar de PyPlot

    – tacoswell

    1 oct 2013 a las 21:55

Avatar de usuario de Robᵩ
Robᵩ

Agrega un label= a cada uno de sus plot() llama y luego llama legend(loc="upper left").

Considere esta muestra (probada con 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()

ingrese la descripción de la imagen aquí

Ligeramente modificado de este tutorial: http://jakevdp.github.io/mpl_tutorial/tutorial_pages/tut1.html

  • ¿Hay alguna manera de hacer esto si no conoce las etiquetas en el momento en que se traza la serie? Es decir, ¿una forma de agregar etiquetas a una serie después de que ya se haya trazado? ¿O tal vez una forma de modificar las etiquetas de marcador de posición antes de mostrar la leyenda?

    – davidA

    5 de julio de 2017 a las 3:42

  • plt.legend(loc='upper left') también funciona, donde plt es desde import matplotlib.pyplot as plt.

    –Matt Kleinsmith

    20 de enero de 2018 a las 8:10


  • Nota para los demás: el plt.legend() llamar necesidades ser después plt.plot(label="lab1")

    – mauriiii

    25 de noviembre de 2019 a las 20:18


  • @davidA Sí, simplemente puede pasar una lista de cadenas a plt.legend: plt.legend(['First Label', 'Second Label'])

    – Apollys apoya a Mónica

    12 dic 2019 a las 23:41


  • Estoy seguro de la documentación real en: matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.legend.html también responde esto, pero es tan doloroso obtener esa información de allí en comparación con aquí. Necesitamos reimaginar la documentación. lolz

    – usuario1953366

    25 de abril de 2020 a las 4:18

avatar de usuario de cameronroytaylor
cameronroytaylor

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

plt.gca().legend()

Puede hacer esto usando el label= palabra clave en cada uno de sus plt.plot() llamadas o asignando sus etiquetas como una tupla o lista dentro legendcomo 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()

pltGcaLeyenda

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

ax = plt.gca()

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

  • respuesta de copiar y pegar que no requiere ninguna lectura, ¡y con una imagen! esta respuesta merece mas credito

    – Gulzar

    10 de junio de 2019 a las 13:59

  • Hola Cameron, traté de comunicarme contigo y esta es la mejor opción que encontré… Eres el autor de una herramienta muy útil que utilicé mucho: web.media.mit.edu/~crtaylor/calculator.html Desafortunadamente, no funciona desde hace algún tiempo. Soy yo o es la herramienta, que está rota. Si es así, ¿puedes arreglarlo?

    – Thomas Wilde

    17 dic 2020 a las 21:20


  • ¡Vaya! Fijado. ¡Gracias por el mensaje! Espero que hayas aprendido algo útil sobre las instancias de Axes 🙂

    – cameronroytaylor

    19 de diciembre de 2020 a las 4:23

Aquí tienes 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()

ingrese la descripción de la imagen aquí

  • Solo tengo curiosidad, ¿por qué su línea de ajuste está tan alejada de los datos?

    – Apollys apoya a Mónica

    12 de diciembre de 2019 a las 23:28

Avatar de usuario de Boris Yakubchik
Boris Yakubchik

Puedes agregar una leyenda personalizada documentación

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

ingrese la descripción de la imagen aquí

avatar de usuario de sajalagrawal
sajalagrawal

Un gráfico simple para curvas de seno y coseno con una leyenda.

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

Gráficas de seno y coseno (haga clic para ver la imagen)

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

Entonces simplemente agregue Pyplot.legend() al final de su secuencia de comandos y la leyenda mostrará estas etiquetas.

¿Ha sido útil esta solución?