Eliminar la leyenda en una figura matplotlib

169

Para agregar una leyenda a un diagrama matplotlib, simplemente se ejecuta legend().

¿Cómo eliminar una leyenda de una trama?

(Lo más cerca que llegué a esto es correr legend([])para vaciar la leyenda de los datos. Pero eso deja un feo rectángulo blanco en la esquina superior derecha).

Olivier Verdier
fuente

Respuestas:

229

A partir de matplotlibv1.4.0rc4 , removese ha agregado un método al objeto de leyenda.

Uso:

ax.get_legend().remove()

o

legend = ax.legend(...)
...
legend.remove()

Vea aquí la confirmación donde se introdujo esto.

naitsirhc
fuente
2
Por alguna razón, la ax.get_legend().remove()solución no funcionó en mi caso, mientras que la segunda solución ( legend = ax.legend() ... legend.remove()) funcionó. tal vez porque axfue un AxesSubploten mi caso?
jhin
@naitsirhc, gracias por compartir.
Andrew Li
91

Si desea trazar un marco de datos de Pandas y desea eliminar la leyenda, agregue leyenda = Ninguno como parámetro al comando de trazado.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df2 = pd.DataFrame(np.random.randn(10, 5))
df2.plot(legend=None)
plt.show()
reparto42
fuente
86

Podrías usar el set_visiblemétodo de la leyenda :

ax.legend().set_visible(False)
draw()

Esto se basa en una respuesta que se me proporcionó en respuesta a una pregunta similar que tuve hace algún tiempo aquí

(Gracias por esa respuesta, Jouni: lo siento, no pude marcar la pregunta como contestada ... ¿tal vez alguien que tenga la autoridad pueda hacerlo por mí?)

ERN
fuente
44
esto solo oculta la leyenda y, de hecho, no elimina el objeto, ¿verdad?
vlsd
16

tienes que agregar las siguientes líneas de código:

ax = gca()
ax.legend_ = None
draw()

gca () devuelve el identificador de ejes actual y tiene esa propiedad legend_

fceruti
fuente
Gracias, eso parece funcionar. (Pero qué interfaz tan horrible ...) Sugiero reemplazar draw()por show(). ¿O hay una ventaja particular en el uso draw?
Olivier Verdier
show()estaría bien si la actualización del gráfico fuera el último comando de un programa. draw()está bien, ya que es el comando general de actualización de gráficos. Por ejemplo, es posible que desee solicitar al usuario alguna entrada en un terminal después de actualizar el gráfico, lo que no se puede hacer con el bloqueo show().
Eric O Lebigot
Correcto. Gracias por la respuesta. Ahora estoy de acuerdo en que drawes más apropiado (pero siempre he usado showpara actualizar mis gráficos ...).
Olivier Verdier
6

Si no está utilizando objetos de trazado de higos y hachas, puede hacerlo así:

import matplotlib.pyplot as plt

# do plot specifics
plt.legend('')
plt.show()
Pelonomi Moiloa
fuente
3

si llamas pyplotcomoplt

frameon=False es eliminar el borde alrededor de la leyenda

y '' está pasando la información de que ninguna variable debe estar en la leyenda

import matplotlib.pyplot as plt
plt.legend('',frameon=False)
Bruno
fuente
1

Hice una leyenda agregándola a la figura, no a un eje (matplotlib 2.2.2). Para eliminarlo, configuro el legendsatributo de la figura en una lista vacía:

import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = ax1.twinx()

ax1.plot(range(10), range(10, 20), label='line 1')
ax2.plot(range(10), range(30, 20, -1), label='line 2')

fig.legend()

fig.legends = []

plt.show()
boudewijn21
fuente
0

Según la información de @naitsirhc, quería encontrar la documentación oficial de la API. Aquí están mis hallazgos y algunos códigos de muestra.

  1. Creé un matplotlib.Axesobjeto por seaborn.scatterplot().
  2. El ax.get_legend()devolverá una matplotlib.legned.Legendinstancia.
  3. Finalmente, llamas a la .remove()función para eliminar la leyenda de tu trama.
ax = sns.scatterplot(......)
_lg = ax.get_legend()
_lg.remove()

Si revisa el matplotlib.legned.Legenddocumento API, no verá la .remove()función.

La razón es que el matplotlib.legned.Legendheredado matplotlib.artist.Artist. Por lo tanto, cuando llamas ax.get_legend().remove()eso básicamente llama matplotlib.artist.Artist.remove().

Al final, incluso podría simplificar el código en dos líneas.

ax = sns.scatterplot(......)
ax.get_legend().remove()
Andrew Li
fuente