matplotlib: die Abstimmung der y-Achsenbeschriftungen in gestapelten scatter-plots
In der Handlung Balg habe ich zwei scatter-plots, die haben unterschiedliche Anzahl skalieren, so dass Ihre Y-Achsen-Beschriftungen sind nicht ausgerichtet. Gibt es eine Möglichkeit, ich kann erzwingen, dass die horizontale Ausrichtung in der y-Achsen-Beschriftungen?
import matplotlib.pylab as plt
import random
import matplotlib.gridspec as gridspec
random.seed(20)
data1 = [random.random() for i in range(10)]
data2 = [random.random()*1000 for i in range(10)]
gs = gridspec.GridSpec(2,1)
fig = plt.figure()
ax = fig.add_subplot(gs[0])
ax.plot(data1)
ax.set_ylabel(r'Label One', size =16)
ax = fig.add_subplot(gs[1])
ax.plot(data2)
ax.set_ylabel(r'Label Two', size =16)
plt.show()
- was Sie wollen, ist hier beschrieben: matplotlib.org/faq/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die set_label_coords Methode.
ax.yaxis.label.get_position()
, aber der Koordinatenraum ist nicht das gleiche wie das, was inax.yaxis.set_label_coords()
-- verwenden Sieax.yaxis.label.set_position()
und ein bisschen ein hack:ax.yaxis._autolabelpos=False
oder anderes, er setzt die position, wenn Sie anrufendraw()
Seit der Niederschrift dieser Frage matplotlib Hinzugefügt hat eine einfach zu bedienende Funktion, richtet labels. Die richtige Art und Weise zu erzwingen, die Ausrichtung des labels mit der Funktion "
fig.align_labels()
vor, zeigt die Abbildung.Wenn du mehr brauchst Feinabstimmung, können Sie auch die Funktionen verwenden, die
Figure.align_xlabels()
oderFigure.align_ylabels()
.Hier ist eine funktionierende version des Kodex in Frage. Nur eine Zeile Hinzugefügt wurde (die vorletzte Zeile) zu erlassen, die Lösung.
Entnehmen Sie bitte die Matplotlib-Dokumentation auf das Ausrichten von Beschriftungen für weitere Informationen.
Als gebucht, in den Kommentar, was Sie suchen, ist gelöst mit
set_label_coords()
als hier beschrieben. Für Ihren Fall wird es etwas sein wie:Hier ist eine Funktion, die ich geschrieben habe, bis zum automatischen ausrichten der Etiketten, aber es scheint nicht zu funktionieren in einem Skript, nur interaktiv.
Und ein Beispiel:
Ich eine Lösung am Ende, aber zuerst muss ich sagen, welcher Weg nicht zum Erfolg führen.
Griff ich dieses Thema vor kurzem, und verbrachte einige Zeit mit dem Versuch verschiedener Lösungen, also versucht, fast alle möglichen Kombinationen von Transformationen zwischen verschiedenen Koordinatensystemen, und Ihre Beziehung mit der
tight_layout()
. Ich experimentierte nur mitbackend_pdf
, also ich kann nicht sagen, über interaktive Medien. Aber kurz, mein Fazit ist, dass egal, wie Sie versuchen, herauszufinden, die Position und versuchen Sie zu verwandeln, es ist nicht möglich, auf dieser Ebene, die Ausrichtung der Achsenbeschriftungen. Ich denke, irgendwie sollte es möglich sein, zum Beispiel irgendwie intern matplotlib ist in der Lage, richten Sie die Achsen der Nebenhandlungen sich.Nur mit der Zeichnung in der pdf-Datei zweimal, und etwas zu tun, wie unten dazwischen, konnte ich erreichen bessere Positionen, aber noch nicht ausgerichtet:
Ist es eine Schande, solch eine grundlegende Funktion nicht erreicht werden kann, und es ist unklar, wie die verschiedenen Koordinatenräumen umgewandelt und skaliert auf die verschiedenen Schritte des Zeichnens. Ich würde schätzen, sehr viel zu sehen, eine klare Erklärung dafür, weil die matplotlib Webseite umreißt nur die Architektur stellt den einfachen Fällen kann Sie aber nicht erklären, Situationen wie diese. Auch ich bin überrascht, dass die Methoden der Annahme oder Rückgabe Koordinaten nicht erzählen in Ihrem docstring welche Arten von Koordinaten, sind diese. Endlich fand ich sehr nützlich dieses tutorial.
Lösung
Am Ende, anstelle von messing mit den Veränderungen, ich habe in der
GridSpec
eine zusätzliche Zeile mit null Höhe und unsichtbar Achsen (gleiche getan werden kann, mit einer null-Breite Spalte für die y-Achsen-Beschriftungen). Dann habe ich die Etiketten für diese Nebenhandlungen, die Einstellung derverticalalignment
zutop
.