Wenn ich meiner Matplotlib-Figur einen Untertitel hinzufüge, wird dieser von den Titeln des Unterplots überlagert. Weiß jemand, wie man sich leicht darum kümmert? Ich habe die tight_layout()
Funktion ausprobiert , aber sie macht die Sache nur noch schlimmer.
Beispiel:
import numpy as np
import matplotlib.pyplot as plt
f = np.random.random(100)
g = np.random.random(100)
fig = plt.figure()
fig.suptitle('Long Suptitle', fontsize=24)
plt.subplot(121)
plt.plot(f)
plt.title('Very Long Title 1', fontsize=20)
plt.subplot(122)
plt.plot(g)
plt.title('Very Long Title 2', fontsize=20)
plt.tight_layout()
plt.show()
python
matplotlib
katrasnikj
quelle
quelle
tight_layout
Dokumente:[left, bottom, right, top] in normalized (0, 1) figure coordinates
tight_layout(rect=[0, 0.03, 1, 0.9])
anstatt0.95
wie in der Antwort.Sie können den Abstand manuell anpassen, indem Sie
plt.subplots_adjust(top=0.85)
:quelle
subplots_adjust
subplots_adjust
dies nach jedemtight_layout
Anruf bei aufgerufen werden muss , da sonst keine Auswirkungen auf den Anruf auftretensubplots_adjust
.Eine Sache, die Sie in Ihrem Code sehr leicht ändern können, ist die, die
fontsize
Sie für die Titel verwenden. Ich gehe jedoch davon aus, dass Sie das nicht nur tun wollen!Einige Alternativen zur Verwendung
fig.subplots_adjust(top=0.85)
:Normalerweise
tight_layout()
macht es einen ziemlich guten Job, alles an guten Orten zu positionieren, damit sie sich nicht überlappen. Der Grund,tight_layout()
der in diesem Fall nicht hilft, ist, dasstight_layout()
fig.suptitle () nicht berücksichtigt wird. Auf GitHub gibt es dazu ein offenes Problem: https://github.com/matplotlib/matplotlib/issues/829 [2014 geschlossen, da ein vollständiger Geometriemanager erforderlich ist - verschoben auf https://github.com/matplotlib/matplotlib / Issues / 1109 ].Wenn Sie den Thread lesen, gibt es eine Lösung für Ihr Problem
GridSpec
. Der Schlüssel ist, beim Aufrufentight_layout
mit demrect
kwarg etwas Platz oben in der Figur zu lassen. Für Ihr Problem lautet der Code:Verwenden von GridSpec
Das Ergebnis:
Vielleicht
GridSpec
ist es ein bisschen übertrieben für Sie, oder Ihr eigentliches Problem wird viel mehr Nebenhandlungen auf einer viel größeren Leinwand oder andere Komplikationen beinhalten. Ein einfacher Hack besteht darin, einfachannotate()
die Koordinaten zu verwenden und zu sperren'figure fraction'
, um a zu imitierensuptitle
. Möglicherweise müssen Sie jedoch einige feinere Anpassungen vornehmen, wenn Sie sich die Ausgabe ansehen. Beachten Sie, dass diese zweite Lösung nicht verwendet wirdtight_layout()
.Einfachere Lösung (muss jedoch möglicherweise verfeinert werden)
Das Ergebnis:
[Verwenden von
Python
2.7.3 (64-Bit) undmatplotlib
1.2.0]quelle
GridSpec
wie kann ich Unterzeichnungen erstellen, die Achsen gemeinsam nutzen? Ich benutze normalerweise,plt.subplots(N,1, sharex=<>, sharey=<>)
wenn ich Nebenhandlungen erstelle, aber der Code, den Sie gepostet haben, verwendetadd_subplot
stattdessenfig.tight_layout(rect=[0, 0.03, 1, 0.95])
funktioniert auch.Eine alternative und einfach zu verwendende Lösung besteht darin, die Koordinaten des Untertiteltextes in der Abbildung mithilfe des y-Arguments im Aufruf von suptitle anzupassen (siehe Dokumentation ):
quelle
Enges Layout funktioniert nicht mit Suptitle, aber es
constrained_layout
funktioniert. Siehe diese Frage Verbessern Sie die Größe / den Abstand von Unterplots mit vielen Unterplots in matplotlibIch fand, dass das Hinzufügen der Nebenhandlungen auf einmal besser aussah, dh
Es kann aber auch an dem Punkt hinzugefügt werden, an dem die Figur erstellt wird:
Hinweis: Um meine Nebenhandlungen näher zusammenzubringen, habe ich auch verwendet
und Constrained_layout funktioniert damit nicht :(
quelle
Ich habe mit dem matplotlib Trimmen Methoden zu kämpfen, so dass ich jetzt habe gerade eine Funktion machte dies über eine tun
bash
AufrufImageMagick
‚s mogrify Befehl , die gut funktioniert und bekommt alle zusätzlichen Leerraum aus dem Wert des Rand. Dies setzt voraus, dass Sie UNIX / Linux verwenden, diebash
Shell verwenden undImageMagick
installiert haben.Rufen Sie einfach nach Ihrem an
savefig()
Anruf an.quelle
Wie von anderen erwähnt, berücksichtigt das enge Layout standardmäßig keine Untertitel. Ich habe jedoch festgestellt, dass es möglich ist, das
bbox_extra_artists
Argument zu verwenden, um den Untertitel als Begrenzungsrahmen zu übergeben, der berücksichtigt werden sollte:Dies zwingt die strenge Layoutberechnung dazu, dies
suptitle
zu berücksichtigen, und es sieht so aus, wie Sie es erwarten würden.quelle
Ich hatte ein ähnliches Problem, das bei der Verwendung
tight_layout
für ein sehr großes Raster von Plots (mehr als 200 Unterplots) und beim Rendern in einem Jupyter-Notizbuch auftrat. Ich habe eine schnelle Lösung gefunden, bei der Sie immersuptitle
in einem bestimmten Abstand über Ihrer obersten Nebenhandlung platziert werden:Bei Unterplots mit variabler Größe können Sie diese Methode weiterhin verwenden, um den oberen Rand des obersten Unterplots abzurufen und dann manuell einen zusätzlichen Betrag zu definieren, der dem Suptitle hinzugefügt werden soll.
quelle
Das einzige, was für mich funktioniert hat, war, den Aufruf zu suptitle zu ändern:
quelle