Ich zeichne die gleiche Art von Informationen, aber für verschiedene Länder, mit mehreren Unterplots mit matplotlib. Das heißt, ich habe 9 Diagramme in einem 3x3-Raster, alle mit den gleichen für Linien (natürlich unterschiedliche Werte pro Linie).
Ich habe jedoch nicht herausgefunden, wie ich eine einzelne Legende (da alle 9 Nebenhandlungen die gleichen Linien haben) nur einmal auf die Figur setzen soll.
Wie mache ich das?
python
matplotlib
Pocketfullofcheese
quelle
quelle
handles, labels = [(a + b) for a, b in zip(ax1.get_legend_handles_labels(), ax2.get_legend_handles_labels())]
figlegend könnte das sein, wonach Sie suchen: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.figlegend
Beispiel hier: http://matplotlib.org/examples/pylab_examples/figlegend_demo.html
Ein anderes Beispiel:
oder:
quelle
lines
Variable, für die das Argument eingefügt werden solllegend
?lines
ist eine Liste von Ergebnissen, von denen zurückgegeben wirdaxes.plot()
(dh jedeaxes.plot
oder eine ähnliche Routine gibt eine "Zeile" zurück). Siehe auch das verknüpfte Beispiel.Für die automatische Positionierung einer einzelnen Legende in a
figure
mit vielen Achsen, wie sie mit erhalten wurdensubplots()
, funktioniert die folgende Lösung sehr gut:Mit
bbox_to_anchor
undbbox_transform=plt.gcf().transFigure
definieren Sie einen neuen Begrenzungsrahmen mit der Größe Ihrerfigure
als Referenzloc
. Mit(0,-0.1,1,1)
bewegt wird diese Bouding-Box leicht nach unten bewegt, um zu verhindern, dass die Legende über anderen Künstlern platziert wird.OBS: Verwenden Sie diese Lösung NACH der Verwendung
fig.set_size_inches()
und VOR der Verwendungfig.tight_layout()
quelle
loc='upper center', bbox_to_anchor=(0.5, 0), bbox_transform=plt.gcf().transFigure
und es wird sich nicht sicher überlappen.Sie müssen nur einmal außerhalb Ihrer Schleife nach der Legende fragen.
In diesem Fall habe ich zum Beispiel 4 Nebenhandlungen mit denselben Zeilen und eine einzelne Legende.
quelle
figlegend
, wie von Evert vorgeschlagen, scheint eine viel bessere Lösung zu sein;)fig.legend()
ist, dass für alle Linien (Diagramme) eine Identifizierung erforderlich ist. Da ich für jedes Unterplot eine Schleife zum Generieren der Linien verwende, besteht die einzige Lösung, die ich gefunden habe, um dies zu überwinden, darin, zuvor eine leere Liste zu erstellen die zweite Schleife, und dann die Zeilen anhängen, während sie erstellt werden ... Dann verwende ich diese Liste als Argument für diefig.legend()
Funktion.dados
dadados
war ein Datensatz aus einer netCDF4-Datei (für jede der in der Liste definierten Dateienficheiros
). In jeder Schleife wird eine andere Datei gelesen und der Abbildung ein Unterplot hinzugefügt.Mir ist aufgefallen, dass keine Antwort ein Bild mit einer einzelnen Legende anzeigt, die auf viele Kurven in verschiedenen Untergrundstücken verweist. Deshalb muss ich Ihnen eine zeigen ... um Sie neugierig zu machen ...
Nun wollen Sie sich den Code ansehen, nicht wahr?
Die zwei Zeilen
Eine Erklärung verdienen - zu diesem Zweck habe ich den kniffligen Teil in einer Funktion zusammengefasst, nur 4 Codezeilen, aber stark kommentiert
PS Ich erkenne, dass dies
sum(list_of_lists, [])
eine wirklich ineffiziente Methode ist, um eine Liste von Listen zu reduzieren, aber ① Ich liebe ihre Kompaktheit, ② normalerweise ein paar Kurven in ein paar Unterplots und ③ Matplotlib und Effizienz? ;-);quelle
Während ich ziemlich spät zum Spiel komme, werde ich hier eine andere Lösung geben, da dies immer noch einer der ersten Links ist, die auf Google angezeigt werden. Mit matplotlib 2.2.2 kann dies mithilfe der Gridspec-Funktion erreicht werden. Im folgenden Beispiel sollen vier Unterzeichnungen 2x2 angeordnet sein, wobei die Legende unten angezeigt wird. Unten wird eine "Faux" -Achse erstellt, um die Legende an einer festen Stelle zu platzieren. Die 'Faux'-Achse wird dann ausgeschaltet, sodass nur die Legende angezeigt wird. Ergebnis: https://i.stack.imgur.com/5LUWM.png .
quelle
Wenn Sie Unterzeichnungen mit Balkendiagrammen verwenden, mit unterschiedlichen Farben für jeden Balken. Es kann schneller sein, die Artefakte selbst zu erstellen
mpatches
Angenommen, Sie haben vier Balken mit unterschiedlichen Farben, da
r
m
c
k
Sie die Legende wie folgt festlegen könnenquelle
plt.legend
, um eine Legende für alle meine Nebenhandlungen zu habenhandles, _ = plt.gca().get_legend_handles_labels()
, dannfig.legend(handles, labels)
Diese Antwort ist eine Ergänzung zu @ Everts auf der Legendenposition.
Mein erster Versuch mit der Lösung von @ Evert schlug aufgrund von Überschneidungen der Legende und des Titels der Nebenhandlung fehl.
Tatsächlich werden die Überlappungen durch verursacht
fig.tight_layout()
, wodurch das Layout der Untergrundstücke ohne Berücksichtigung der Figurenlegende geändert wird. Jedoch,fig.tight_layout()
jedoch notwendig.Um die Überlappungen zu vermeiden, können wir durch anweisen
fig.tight_layout()
, Leerzeichen für die Legende der Figur zu lassenfig.tight_layout(rect=(0,0,1,0.9))
.Beschreibung der Parameter tight_layout () .
quelle
Um auf der Antwort von @ gboffi und Ben Usman aufzubauen:
In einer Situation, in der man verschiedene Linien in verschiedenen Untergrundstücken mit derselben Farbe und Beschriftung hat, kann man etwas in der Richtung von tun
quelle