Ich habe die folgende Handlung:
fig,ax = plt.subplots(5,2,sharex=True,sharey=True,figsize=fig_size)
und jetzt möchte ich diesem Plot gemeinsame x-Achsen-Beschriftungen und y-Achsen-Beschriftungen geben. Mit "common" meine ich, dass es eine große Beschriftung der x-Achse unter dem gesamten Raster der Unterzeichnungen und eine große Beschriftung der y-Achse rechts geben sollte. Ich kann in der Dokumentation für nichts dazu finden plt.subplots
, und meine Googler schlagen vor, dass ich zunächst einen großen machen muss plt.subplot(111)
- aber wie füge ich dann meine 5 * 2-Nebenhandlungen in diese ein plt.subplots
?
python
matplotlib
jolindbe
quelle
quelle
Antworten:
Das sieht so aus, wie Sie es tatsächlich wollen. Der gleiche Ansatz dieser Antwort wird auf Ihren speziellen Fall angewendet:
quelle
plt.text
. Sie erstellen Ihre Unterzeichnungen, fügen dann aber eine Bit-Darstellung hinzu, machen sie unsichtbar und beschriften ihre x und y.tight_layout
?tight_layout
Ersetzen0.04
durch0
scheint zu funktionieren.fig.text
ist keine gute Idee. Dies bringt Dinge durcheinander wieplt.tight_layout()
Da ich es für relevant und elegant genug halte (es müssen keine Koordinaten angegeben werden, um Text zu platzieren), kopiere ich (mit einer geringfügigen Anpassung) eine Antwort auf eine andere verwandte Frage .
Dies führt zu folgenden Ergebnissen (mit matplotlib Version 2.2.0):
quelle
constrained_layout=True
da überlappende Beschriftungen erstellt werden. In diesem Fall müssen Sie die Ränder der Unterzeichnungen manuell anpassen.Ohne dass
sharex=True, sharey=True
du bekommst:Damit sollten Sie es schöner bekommen:
Wenn Sie jedoch zusätzliche Beschriftungen hinzufügen möchten, sollten Sie diese nur zu den Randdiagrammen hinzufügen:
Das Hinzufügen eines Etiketts für jedes Diagramm würde es verderben (möglicherweise gibt es eine Möglichkeit, wiederholte Etiketten automatisch zu erkennen, aber mir ist keines bekannt).
quelle
Seit dem Befehl:
Sie haben ein Tupel zurückgegeben, das aus der Abbildung und einer Liste der Achseninstanzen besteht. Es reicht bereits aus, etwas zu tun wie (Gedanken, zu denen ich geändert
fig,ax
habefig,axes
):Wenn Sie zufällig einige Details zu einem bestimmten Unterplot ändern möchten, können Sie darauf zugreifen,
axes[i]
indem Siei
über Ihre Unterplots iterieren.Es kann auch sehr hilfreich sein, a aufzunehmen
am Ende der Datei vor dem
plt.show()
, um überlappende Beschriftungen zu vermeiden.quelle
plt.subplots()
wird eine neue Figureninstanz erstellt . Wenn Sie sich an diesen Befehl halten möchten, können Sie einfach eine hinzufügenbig_ax = fig.add_subplot(111)
, da Sie bereits eine Figur haben und eine weitere Achse hinzufügen können. Danach können Siebig_ax
die Art und Weise ändern, wie sie im Link von Hooked angezeigt wird.none
:big_ax.set_axis_bgcolor('none')
Sie sollten auch die Etikettenfarbe erstellennone
(im Gegensatz zu dem von Hooked verknüpften Beispiel):big_ax.tick_params(labelcolor='none', top='off', bottom='off', left='off', right='off')
AttributeError: 'numpy.ndarray' object has no attribute 'set_xlabel'
in der Anweisungax.set_xlabel('Common x-label')
. Kannst du es herausfinden?Es sieht besser aus, wenn Sie Platz für die allgemeinen Beschriftungen reservieren, indem Sie unsichtbare Beschriftungen für die Unterzeichnung in der unteren linken Ecke erstellen. Es ist auch gut, die Schriftgröße von rcParams zu übergeben. Auf diese Weise ändern sich die Größe der allgemeinen Beschriftungen mit Ihrem RC-Setup, und die Achsen werden ebenfalls angepasst, um Platz für die allgemeinen Beschriftungen zu lassen.
quelle
Beim Zeichnen eines Diagrammrasters stieß ich auf ein ähnliches Problem. Die Grafiken bestanden aus zwei Teilen (oben und unten). Das y-Label sollte über beiden Teilen zentriert sein.
Ich wollte keine Lösung verwenden, die davon abhängt, die Position in der äußeren Figur zu kennen (wie fig.text ()), also habe ich die y-Position der Funktion set_ylabel () manipuliert. Es ist normalerweise 0,5, die Mitte des Diagramms, zu dem es hinzugefügt wird. Da der Abstand zwischen den Teilen (hspace) in meinem Code Null war, konnte ich die Mitte der beiden Teile relativ zum oberen Teil berechnen.
Bild
Nachteile:
Der horizontale Abstand zum Plot basiert auf dem oberen Teil, die unteren Häkchen können sich bis in das Etikett erstrecken.
Die Formel berücksichtigt keinen Abstand zwischen den Teilen.
Löst eine Ausnahme aus, wenn die Höhe des Oberteils 0 beträgt.
Es gibt wahrscheinlich eine allgemeine Lösung, die das Auffüllen zwischen Zahlen berücksichtigt.
quelle
Aktualisieren:
Diese Funktion ist jetzt Teil des Proplot-Matplotlib-Pakets , das ich kürzlich auf pypi veröffentlicht habe. Wenn Sie Zahlen erstellen, werden die Beschriftungen standardmäßig von den Achsen "geteilt".
Ursprüngliche Antwort:
Ich habe eine robustere Methode entdeckt:
Wenn Sie die
bottom
undtop
kwargs kennen, die in eineGridSpec
Initialisierung eingegangen sind , oder wenn Sie die Kantenpositionen Ihrer Achsen auf andere Weise inFigure
Koordinaten kennen , können Sie die ylabel-Position auch inFigure
Koordinaten mit einer ausgefallenen "Transformations" -Magie angeben . Beispielsweise:... und Sie sollten sehen, dass das Etikett immer noch entsprechend von links nach rechts angepasst wird, um eine Überlappung mit Ticklabels zu vermeiden, genau wie normal - aber jetzt wird es so angepasst, dass es immer genau zwischen den gewünschten Unterplots liegt.
Wenn Sie nicht einmal verwenden
set_position
, wird das ylabel standardmäßig genau in der Mitte der Abbildung angezeigt . Ich vermute, das liegt daran, dass beim endgültigen Zeichnen der Beschriftungmatplotlib
0,5 für diey
Koordinate verwendet wird, ohne zu überprüfen, ob sich die zugrunde liegende Koordinatentransformation geändert hat.quelle