Warum ist mein xlabel in meinem matplotlib-Plot abgeschnitten?

303

Ich matplotlibzeichne einen Datensatz mit einem xlabel, das ziemlich "groß" ist (es ist eine in TeX gerenderte Formel, die einen Bruch enthält und daher das Höhenäquivalent von ein paar Textzeilen hat).

In jedem Fall wird der Boden der Formel immer abgeschnitten, wenn ich die Zahlen zeichne. Das Ändern der Figurengröße scheint dies nicht zu helfen, und ich konnte nicht herausfinden, wie die x-Achse "nach oben" verschoben werden kann, um Platz für das xlabel zu schaffen. So etwas wäre eine vernünftige vorübergehende Lösung, aber was schön wäre, wäre eine Möglichkeit, matplotlib automatisch erkennen zu lassen, dass das Etikett abgeschnitten ist, und die Größe entsprechend zu ändern.

Hier ist ein Beispiel dafür, was ich meine:

import matplotlib.pyplot as plt

plt.figure()
plt.ylabel(r'$\ln\left(\frac{x_a-x_b}{x_a-x_c}\right)$')
plt.xlabel(r'$\ln\left(\frac{x_a-x_d}{x_a-x_e}\right)$')
plt.show()

Während Sie das gesamte ylabel sehen können, ist das xlabel unten abgeschnitten.

Falls dies ein maschinenspezifisches Problem ist, führe ich dies unter OSX 10.6.8 mit matplotlib 1.0.0 aus

Andrew
quelle
4
Sie können auf einer Image-Hosting-Site posten und hier verlinken.
agf
1
Es ist hilfreich, wenn Sie einen minimalistischen Beispielcode veröffentlichen können, der dieses Problem auslöst. Auf diese Weise können Menschen Ihr Problem schneller verstehen und reproduzieren, und sie helfen Ihnen mit größerer Wahrscheinlichkeit.
Denilson Sá Maia
Ihr Code funktioniert auf meinem Computer (Ubuntu 11.04 64bit) einwandfrei (die Formel ist vollständig sichtbar). Möglicherweise liegt ein maschinenspezifisches Problem vor [wie eine Schriftart mit falschen Dimensionsinformationen, die im Bild verwendet werden?]. Sie können möglicherweise das System angeben, das Sie in Ihrer Frage verwenden.
Mac
9
Vielleicht möchten Sie auch versuchen plt.savefig("test.png",bbox_inches='tight'): stackoverflow.com/questions/21288062/…
Yibo Yang

Antworten:

474

Verwenden:

import matplotlib.pyplot as plt

plt.gcf().subplots_adjust(bottom=0.15)

Platz für das Etikett schaffen.

Bearbeiten:

Da ich die Antwort gegeben habe, matplotlibhat die tight_layout()Funktion hinzugefügt . Also schlage ich vor, es zu benutzen:

plt.tight_layout()

sollte Platz für das xlabel machen.

Tillsten
quelle
141
Ich finde es ziemlich seltsam, dass man einen zusätzlichen Anruf tätigen muss, um Platz für einen wesentlichen Teil einer Handlung zu schaffen. Was ist der Grund dafür?
Ein anderer Ben
3
Nur aus Neugier, warum hast du gcf().subplots_adjustlieber als plt.subplots_adjust? Ist da ein Unterschied?
Wacholder
49
Was sind gcfund gca? Du hast es versäumt zu erklären!
Colonel Panic
12
Ich war mit dem gleichen Problem konfrontiert, und obwohl tight_layout()der xlabels-Cutoff behoben wurde, wurde mein ylabel leider abgeschnitten (was vorher nicht abgeschnitten wurde). Das erste Mittel ( subplots_adjust(bottom=0.25)) hat jedoch gut funktioniert. Vielen Dank.
Scott H
17
@ColonelPanic gcf()und gca()sind "Aktuelle Zahl abrufen " bzw. "Aktuelle Achsen abrufen ".
DrMisha
150

Eine einfache Option besteht darin, matplotlib so zu konfigurieren, dass die Plotgröße automatisch angepasst wird. Es funktioniert perfekt für mich und ich bin mir nicht sicher, warum es nicht standardmäßig aktiviert ist.

Methode 1

Stellen Sie dies in Ihrer matplotlibrc-Datei ein

figure.autolayout : True

Weitere Informationen zum Anpassen der matplotlibrc-Datei finden Sie hier: http://matplotlib.org/users/customizing.html

Methode 2

Aktualisieren Sie die rcParams zur Laufzeit wie folgt

from matplotlib import rcParams
rcParams.update({'figure.autolayout': True})

Der Vorteil dieses Ansatzes besteht darin, dass Ihr Code auf unterschiedlich konfigurierten Computern dieselben Diagramme erstellt.

Amit Moscovich
quelle
Ich hatte einige Probleme mit zu großen Farbleisten, wenn ich diese Option verwendete. Eine mögliche Lösung wird hier diskutiert: matplotlib.org/users/tight_layout_guide.html
PiQuer
2
tight_layout macht ein Durcheinander, wenn ich benutzerdefinierte (große!) Schriftgrößen einstelle. Das macht einen viel besseren Job.
BenB
Das Aktualisieren von rcParams war wirklich das einzige, was mir bei der Verwendung des pgf-Backends mit LaTeX geholfen hat. (obwohl es die Handlung rechteckig macht, was mir nichts ausmacht)
h4nek
Nur das hat bei mir funktioniert; Keines von tight_layout oder box_inches funktionierte
zed111
106

Wenn Sie es in einer Datei speichern möchten, lösen Sie es mit dem folgenden bbox_inches="tight"Argument:

plt.savefig('myfile.png', bbox_inches = "tight")
Guido
quelle
2
@ Guido hat den Tag gerettet
pcko1
7

Setzen Sie plot.tight_layout()nach allen Änderungen in das Diagramm, kurz vor show()oder savefig()lösen Sie das Problem.

Armin Okić
quelle
1
Dies macht keinen Platz für den Grund der Handlung, sondern skaliert die gesamte Handlung neu, was in einigen Fällen (wie bei mir) dazu führen kann, dass die Handlung wirklich seltsam aussieht.
89f3a1c
6

plt.autoscale() arbeitete für mich.

dgoodman1
quelle
5

Sie können die benutzerdefinierte Auffüllung auch $HOME/.matplotlib/matplotlib_rcwie folgt als Standard festlegen . Im folgenden Beispiel habe ich sowohl die untere als auch die standardmäßige Polsterung geändert:

# The figure subplot parameters.  All dimensions are a fraction of the
# figure width or height
figure.subplot.left  : 0.1 #left side of the subplots of the figure
#figure.subplot.right : 0.9 
figure.subplot.bottom : 0.15
...
Мати Тернер
quelle