Ich kenne folgende Fragen:
Matplotlib savefig mit einer Legende außerhalb des Plots
Wie man die Legende aus der Handlung entfernt
Es scheint, dass die Antworten auf diese Fragen den Luxus haben, mit dem exakten Schrumpfen der Achse herumspielen zu können, damit die Legende passt.
Das Verkleinern der Achsen ist jedoch keine ideale Lösung, da dadurch die Daten kleiner werden und die Interpretation tatsächlich schwieriger wird. besonders wenn es komplex ist und viele Dinge vor sich gehen ... daher braucht es eine große Legende
Das Beispiel einer komplexen Legende in der Dokumentation zeigt, dass dies erforderlich ist, da die Legende in ihrem Diagramm tatsächlich mehrere Datenpunkte vollständig verdeckt.
http://matplotlib.sourceforge.net/users/legend_guide.html#legend-of-complex-plots
Ich möchte in der Lage sein, die Größe des Figurenfelds dynamisch zu erweitern, um die expandierende Figurenlegende aufzunehmen.
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-2*np.pi, 2*np.pi, 0.1)
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(x, np.sin(x), label='Sine')
ax.plot(x, np.cos(x), label='Cosine')
ax.plot(x, np.arctan(x), label='Inverse tan')
lgd = ax.legend(loc=9, bbox_to_anchor=(0.5,0))
ax.grid('on')
Beachten Sie, dass sich das endgültige Etikett 'Inverse Tan' tatsächlich außerhalb des Zahlenfelds befindet (und schlecht abgeschnitten aussieht - keine Veröffentlichungsqualität!)
Schließlich wurde mir gesagt, dass dies in R und LaTeX normal ist, daher bin ich ein wenig verwirrt, warum dies in Python so schwierig ist ... Gibt es einen historischen Grund? Ist Matlab in dieser Angelegenheit genauso arm?
Ich habe die (nur geringfügig) längere Version dieses Codes auf Pastebin http://pastebin.com/grVjc007
quelle
tight_layout()
sollte geändert werden, um Legenden zu berücksichtigen.Antworten:
Tut mir leid, EMS, aber ich habe gerade eine weitere Antwort von der Matplotlib-Mailling-Liste erhalten (Dank geht an Benjamin Root).
Der gesuchte Code passt den savefig-Aufruf an:
Dies ähnelt anscheinend dem Aufruf von tight_layout, aber stattdessen erlauben Sie savefig, zusätzliche Künstler bei der Berechnung zu berücksichtigen. Dadurch wurde die Größe des Figurenfelds tatsächlich wie gewünscht geändert.
Dies erzeugt:
[Bearbeiten] Mit dieser Frage sollte die Verwendung beliebiger Koordinatenplatzierungen von beliebigem Text vollständig vermieden werden, wie dies bei der herkömmlichen Lösung dieser Probleme der Fall war. Trotzdem haben in letzter Zeit zahlreiche Änderungen darauf bestanden, diese einzufügen, oft auf eine Weise, die dazu führte, dass der Code einen Fehler auslöste. Ich habe jetzt die Probleme behoben und den beliebigen Text aufgeräumt, um zu zeigen, wie diese auch im Algorithmus bbox_extra_artists berücksichtigt werden.
quelle
plt.show()
. Irgendeine Lösung dafür?fig.legend()
Methode verwendet , wirklich komisch.Hinzugefügt: Ich habe etwas gefunden, das den Trick sofort ausführen sollte, aber der Rest des folgenden Codes bietet auch eine Alternative.
Verwenden Sie die
subplots_adjust()
Funktion, um den unteren Rand des Unterplots nach oben zu verschieben:Spielen Sie dann mit dem Versatz im Legendenteil
bbox_to_anchor
des Legendenbefehls, um das Legendenfeld an die gewünschte Stelle zu bringen. Eine Kombination aus Einstellenfigsize
und Verwenden vonsubplots_adjust(bottom=...)
sollte ein Qualitätsdiagramm für Sie erstellen.Alternative: Ich habe einfach die Zeile geändert:
zu:
und geändert
zu
und es wird gut auf meinem Bildschirm angezeigt (ein 24-Zoll-CRT-Monitor).
Hier wird
figsize=(M,N)
das Figurenfenster auf M Zoll mal N Zoll eingestellt. Spielen Sie einfach damit, bis es für Sie richtig aussieht. Konvertieren Sie es in ein skalierbareres Bildformat und verwenden Sie GIMP, um es bei Bedarf zu bearbeiten, oder schneiden Sie es einfach mit der LaTeX-viewport
Option zu, wenn Sie Grafiken einfügen.quelle
Hier ist eine andere, sehr manuelle Lösung. Sie können die Größe der Achse definieren und die Auffüllungen werden entsprechend berücksichtigt (einschließlich Legende und Häkchen). Hoffe, es ist für jemanden von Nutzen.
Beispiel (Achsengröße sind gleich!):
Code:
quelle
plt.draw()
habeax.figure.canvas.draw()
. Ich bin mir nicht sicher warum, aber vor dieser Änderung wurde die Legendengröße nicht aktualisiert.fig.set_size_inches(widthTot,heightTot)
anfig.set_size_inches(widthTot,heightTot, forward=True)
.