Entfernen Sie die Legende auf einer Matplotlib-Figur

169

Um einem Matplotlib-Plot eine Legende hinzuzufügen, wird einfach ausgeführt legend().

Wie entferne ich eine Legende aus einem Plot?

(Am nächsten kam ich dem Ausführen, legend([])um die Legende aus den Daten zu leeren. Aber das lässt ein hässliches weißes Rechteck in der oberen rechten Ecke.)

Olivier Verdier
quelle

Antworten:

229

Ab matplotlibv1.4.0rc4 wurde removedem Legendenobjekt eine Methode hinzugefügt.

Verwendung:

ax.get_legend().remove()

oder

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

Sehen Sie hier für die dort engagieren , wo dies eingeführt wurde.

naitsirhc
quelle
2
Aus irgendeinem Grund ax.get_legend().remove()funktionierte die Lösung in meinem Fall nicht, während die zweite Lösung ( legend = ax.legend() ... legend.remove()) funktionierte. vielleicht weil axwar ein AxesSubplotin meinem fall?
Jhin
@naitsirhc, Danke für dein Teilen.
Andrew Li
90

Wenn Sie einen Pandas-Datenrahmen zeichnen und die Legende entfernen möchten, fügen Sie dem Plot-Befehl legend = None als Parameter hinzu.

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()
cast42
quelle
86

Sie können die set_visibleMethode der Legende verwenden:

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

Dies basiert auf einer Antwort, die mir als Antwort auf eine ähnliche Frage gegeben wurde, die ich vor einiger Zeit hier hatte

(Danke für diese Antwort Jouni - Es tut mir leid, dass ich die Frage nicht als beantwortet markieren konnte ... vielleicht kann jemand, der die Autorität hat, dies für mich tun?)

ERN
quelle
4
Dies verbirgt nur die Legende und entfernt das Objekt tatsächlich nicht, oder?
Vlsd
16

Sie müssen die folgenden Codezeilen hinzufügen:

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

gca () gibt das aktuelle Achsenhandle zurück und hat die Eigenschaft legend_

fceruti
quelle
Danke, das scheint zu funktionieren. (Aber was für eine schreckliche Schnittstelle ...) Ich schlage vor, draw()durch zu ersetzen show(). Oder gibt es einen besonderen Vorteil bei der Verwendung draw?
Olivier Verdier
show()wäre in Ordnung, wenn die Grafikaktualisierung der letzte Befehl eines Programms wäre. draw()ist in Ordnung, da es sich um den allgemeinen Befehl zum Aktualisieren des Diagramms handelt. Möglicherweise möchten Sie den Benutzer beispielsweise nach der Aktualisierung des Diagramms zur Eingabe in ein Terminal auffordern, was mit der Blockierung nicht möglich ist show().
Eric O Lebigot
Richtig. Danke für die Antwort. Jetzt stimme ich zu, dass dies drawangemessener ist (aber ich habe showmeine Grafiken immer aktualisiert ...).
Olivier Verdier
6

Wenn Sie keine Feigen- und Axt-Plotobjekte verwenden, können Sie dies folgendermaßen tun:

import matplotlib.pyplot as plt

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

wenn du anrufst pyplotalsplt

frameon=False ist, den Rand um die Legende zu entfernen

und '' übergibt die Information, dass keine Variable in der Legende sein sollte

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

Ich habe eine Legende gemacht, indem ich sie der Figur hinzugefügt habe, nicht einer Achse (matplotlib 2.2.2). Um es zu entfernen, setze ich das legendsAttribut der Figur auf eine leere Liste:

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
quelle
0

Nach den Informationen von @naitsirhc wollte ich die offizielle API-Dokumentation finden. Hier sind meine Ergebnisse und ein Beispielcode.

  1. Ich habe ein matplotlib.AxesObjekt von erstellt seaborn.scatterplot().
  2. Der ax.get_legend()gibt eine matplotlib.legned.LegendInstanz zurück.
  3. Schließlich rufen Sie .remove()function auf, um die Legende aus Ihrem Plot zu entfernen.
ax = sns.scatterplot(......)
_lg = ax.get_legend()
_lg.remove()

Wenn Sie das matplotlib.legned.LegendAPI-Dokument überprüfen , wird die .remove()Funktion nicht angezeigt.

Der Grund ist, dass die matplotlib.legned.Legendgeerbte die matplotlib.artist.Artist. Wenn Sie das anrufen ax.get_legend().remove(), rufen Sie daher grundsätzlich an matplotlib.artist.Artist.remove().

Am Ende könnten Sie den Code sogar in zwei Zeilen vereinfachen.

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