No se encontraron manijas con etiquetas para poner en la leyenda

Salman Mehmood 15 febrero 2024
  1. No se encontraron manijas con etiquetas para poner en la leyenda
  2. Resolver No se encontraron identificadores con etiquetas para poner en la leyenda en Matplotlib
No se encontraron manijas con etiquetas para poner en la leyenda

Este artículo demuestra cómo podemos resolver la advertencia No se encontraron identificadores con etiquetas para poner en la leyenda al intentar trazar algo usando Matplotlib.

No se encontraron manijas con etiquetas para poner en la leyenda

Utilizado ampliamente en varias aplicaciones, Matplotlib es una biblioteca de Python que tiene como objetivo brindar a los usuarios una funcionalidad similar a la de MATLAB hasta cierto punto. Crea visualizaciones estáticas, animadas e interactivas de datos para análisis y otros fines.

Al tratar de trazar algo usando Matplotlib, es común que queramos etiquetar partes específicas de nuestros gráficos de visualización, ya sea para comprender o por alguna otra razón. Durante este proceso, podemos encontrar una advertencia que insinúa que no se pudo crear una leyenda debido a algún error.

Considere el siguiente código.

import matplotlib.pyplot as plt

fig = plt.figure()

ax = fig.add_subplot(111)
ax.spines["left"].set_position("zero")
ax.spines["right"].set_color("none")
ax.spines["bottom"].set_position("zero")
ax.spines["top"].set_color("none")

plt.axis([-5, 5, -5, 5])

ax.xaxis.set_ticks_position("bottom")
ax.yaxis.set_ticks_position("left")

plt.grid()

plt.arrow(0, 0, 3, 1, head_width=0.2, color="r", length_includes_head=True)
plt.arrow(0, 0, 1, 3, head_width=0.2, color="g", length_includes_head=True)
plt.arrow(0, 0, 4, 4, head_width=0.2, color="b", length_includes_head=True)

plt.legend()
plt.show()

Tras la ejecución del programa, vemos el siguiente resultado.

Salida del problema

En el código mencionado anteriormente, al intentar trazar el gráfico, recibimos un error, que se da como:

No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when legend() is called with no argument.

Nota: En actualizaciones recientes, la advertencia ahora comienza con “Sin artistas” en lugar de “Sin identificadores”.

Como es evidente en la imagen de salida, se puede ver que no se generó ninguna leyenda; en lugar de las etiquetas, solo vemos las parcelas.

Resolver No se encontraron identificadores con etiquetas para poner en la leyenda en Matplotlib

La advertencia se produce si no ha proporcionado los parámetros de etiqueta antes de llamar al método leyenda() en una figura trazada.

pyplot es una interfaz basada en estado para Matplotlib que permite el trazado interactivo de figuras en Python. El método legend() puede agregar una leyenda a los ejes.

Sin embargo, si omitimos la opción de etiquetas y luego llamamos a la función leyenda(), recibiremos el mensaje de error.

No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when `legend()` is called with no argument.

Los siguientes son algunos escenarios en los que aparece esta advertencia.

Causa 1: No se declararon etiquetas

Puede darse el caso de que las etiquetas que se suponía que debían incluirse en la leyenda no fueran declaradas en primer lugar.

Considere el siguiente ejemplo.

plt.arrow(0, 0, 3, 1, head_width=0.2, color="r", length_includes_head=True)
plt.arrow(0, 0, 1, 3, head_width=0.2, color="g", length_includes_head=True)
plt.arrow(0, 0, 4, 4, head_width=0.2, color="b", length_includes_head=True)

En la declaración de flechas anterior, a ninguno de ellos se le asignó ninguna etiqueta, lo que puede provocar que la leyenda no encuentre las etiquetas que se supone que deben agregarse a la leyenda.

La solución, en nuestro caso, es simple, agregue las etiquetas a las flechas.

plt.arrow(0, 0, 3, 1, head_width=0.2, color="r", length_includes_head=True, label="u")
plt.arrow(0, 0, 1, 3, head_width=0.2, color="g", length_includes_head=True, label="v")
plt.arrow(0, 0, 4, 4, head_width=0.2, color="b", length_includes_head=True, label="u+v")

En lugar de declarar etiquetas dentro del método plt.arrow(), también podemos declarar las etiquetas pasándolas a la propia función plt.legend().

El método plt.legend() toma una lista o una tupla que contiene las etiquetas necesarias que puede querer declarar en su trama.

Considere el siguiente ejemplo.

plt.arrow(0, 0, 3, 1, head_width=0.2, color="r", length_includes_head=True)
plt.arrow(0, 0, 1, 3, head_width=0.2, color="g", length_includes_head=True)
plt.arrow(0, 0, 4, 4, head_width=0.2, color="b", length_includes_head=True)

plt.legend(["u", "v", "u+v"])

Ahora que se han definido las etiquetas, la advertencia no aparecerá y nuestro gráfico se trazará con éxito, como se muestra a continuación.

Solución 1

Puede ser un error bastante común que a veces olvidemos declarar las etiquetas para la leyenda. Es una buena práctica declarar las etiquetas cada vez que declaramos los elementos del gráfico; este enfoque ayuda a reducir las posibilidades de perder la declaración de una determinada etiqueta.

Como se ve en el código, matplotlib permite la declaración de etiquetas como argumentos para varias funciones que crean diferentes elementos de trama (plt.arrow() en nuestro caso).

Causa 2: trama hecha después de la leyenda

Otra causa raíz de este problema puede ser que no se siga correctamente el orden en el que se debe trazar correctamente el gráfico; por ejemplo, si se crea una leyenda antes de crear el gráfico, seguirá apareciendo la advertencia y no se creará la leyenda.

Considere el siguiente código.

plt.legend()  # Wrong Placement

plt.arrow(0, 0, 3, 1, head_width=0.2, color="b", length_includes_head=True)
plt.arrow(0, 0, 3, 4, head_width=0.2, color="g", length_includes_head=True)

Aquí hemos llamado a la función leyenda() antes de crear la trama en sí; dado que no se declararon etiquetas (o gráficos) cuando se llama a la función leyenda(), aparecerá la advertencia y la leyenda permanecerá vacía.

Para solucionar esto, asegúrese de llamar a leyenda(). Cada aspecto del gráfico se ha trazado con etiquetas adecuadas.

En nuestro caso, eso sería:

plt.arrow(0, 0, 3, 1, head_width=0.2, color="b", length_includes_head=True, label="x")
plt.arrow(0, 0, 3, 4, head_width=0.2, color="g", length_includes_head=True, label="y")

plt.legend()  # Correct placement

Ahora que se ha corregido el orden de plt.legend(), la trama contendrá la leyenda definida.

Solución 2

Código completo:

import matplotlib.pyplot as plt

fig = plt.figure()

ax = fig.add_subplot(111)

ax.spines["left"].set_position("zero")
ax.spines["right"].set_color("none")
ax.spines["bottom"].set_position("zero")
ax.spines["top"].set_color("none")

plt.axis([-5, 5, -5, 5])

ax.xaxis.set_ticks_position("bottom")
ax.yaxis.set_ticks_position("left")

plt.grid()

plt.arrow(0, 0, 3, 1, head_width=0.2, color="r", length_includes_head=True, label="u")
plt.arrow(0, 0, 1, 3, head_width=0.2, color="g", length_includes_head=True, label="v")
plt.arrow(0, 0, 4, 4, head_width=0.2, color="b", length_includes_head=True, label="u+v")

plt.legend()
# plt.legend(['u','v','u+v'])
plt.show()
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn