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:
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?
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()
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, dondeplt
es desdeimport 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ésplt.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
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 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()
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()
-
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
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()
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()
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.
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 dePyPlot
– tacoswell
1 oct 2013 a las 21:55