Dlaczego moja xlabel jest odcięta w moim wykresie matplotlib?

302

matplotlibPlanuję zestaw danych przy użyciu, gdzie mam Xlabel, który jest dość „wysoki” (jest to formuła renderowana w TeX-ie, która zawiera ułamek, a zatem ma odpowiednik wysokości kilku linii tekstu).

W każdym razie dolna część wzoru jest zawsze odcinana, gdy rysuję liczby. Wydaje się, że zmiana wielkości figury nie pomaga i nie byłem w stanie wymyślić, jak przesunąć „oś X” w górę, aby zrobić miejsce dla Xlabel. Coś takiego byłoby rozsądnym rozwiązaniem tymczasowym, ale fajnie byłoby mieć sposób, aby matplotlib automatycznie rozpoznał, że etykieta została odcięta i odpowiednio zmienił rozmiar.

Oto przykład tego, co mam na myśli:

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()

podczas gdy możesz zobaczyć cały ylabel, xlabel jest ucięty na dole.

W przypadku, gdy jest to problem specyficzny dla komputera, uruchamiam to na OSX 10.6.8 z matplotlib 1.0.0

Andrzej
źródło
4
Możesz opublikować post na stronie hostującej obrazy i połączyć go tutaj.
agf
1
Pomaga, jeśli możesz opublikować minimalistyczny przykładowy kod, który powoduje ten problem. W ten sposób ludzie będą mogli szybciej zrozumieć i odtworzyć Twój problem, a oni będą bardziej skłonni Ci pomóc.
Denilson Sá Maia
Twój kod działa dobrze (wyświetl formułę w pełni widoczną) na moim komputerze (ubuntu 11.04 64bit). Być może występuje problem związany z maszyną [na przykład czcionka z nieprawidłowymi informacjami wymiarowymi?]. Być może możesz podać system, którego używasz w swoim pytaniu.
Mac
9
możesz także spróbować plt.savefig("test.png",bbox_inches='tight'): stackoverflow.com/questions/21288062/...
Yibo Yang,

Odpowiedzi:

473

Posługiwać się:

import matplotlib.pyplot as plt

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

zrobić miejsce dla etykiety.

Edytować:

Odkąd dałem odpowiedź, matplotlibdodałem tight_layout()funkcję. Proponuję więc użyć:

plt.tight_layout()

powinien zrobić miejsce dla Xlabel.

tillsten
źródło
141
Wydaje mi się dość dziwne, że trzeba zrobić dodatkowe połączenie, aby zrobić miejsce na niezbędną część fabuły. Jakie jest tego uzasadnienie?
inny ben
3
Właśnie z ciekawości, dlaczego gcf().subplots_adjustwolisz niż plt.subplots_adjust? Czy jest jakaś różnica?
jałowiec
49
Jakie są gcfi gca? Zlekceważyłeś wyjaśnić!
Pułkownik Panic
12
Miałem ten sam problem i chociaż tight_layout()naprawiłem odcięcie xlabels, niestety spowodowało to odcięcie mojego ylabel (co nie było wcześniej odcinane). Jednak pierwsze remedium ( subplots_adjust(bottom=0.25)) działało dobrze. Dzięki.
Scott H
17
@ColonelPanic gcf()i gca()odpowiednio „uzyskaj bieżącą liczbę” i „pobierz bieżące osie”.
DrMisha
150

Łatwą opcją jest skonfigurowanie matplotlib, aby automatycznie dostosowywał rozmiar wydruku. Działa idealnie dla mnie i nie jestem pewien, dlaczego nie jest domyślnie aktywowany.

Metoda 1

Ustaw to w swoim pliku matplotlibrc

figure.autolayout : True

Zobacz tutaj, aby uzyskać więcej informacji na temat dostosowywania pliku matplotlibrc: http://matplotlib.org/users/customizing.html

Metoda 2

Zaktualizuj rcParams podczas takiego działania

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

Zaletą korzystania z tego podejścia jest to, że Twój kod będzie generował te same wykresy na różnie skonfigurowanych komputerach.

Amit Moscovich
źródło
Miałem pewne problemy ze zbyt dużymi paskami kolorów podczas korzystania z tej opcji. Omówiono tutaj jedno możliwe rozwiązanie: matplotlib.org/users/tight_layout_guide.html
PiQuer
2
tight_layout robi bałagan, kiedy ustawiam niestandardowe (duże!) czcionki. To robi znacznie lepszą robotę.
BenB
Aktualizacja rcParams była naprawdę jedyną rzeczą, która działała dla mnie, gdy używałem backendu pgf z LaTeX-em. (chociaż sprawia, że ​​fabuła jest prostokątna, co nie mam nic przeciwko)
h4nek
Tylko to mi działało; żaden z tight_layout ani box_inches nie działał
zed111
106

Jeśli chcesz zapisać go w pliku, rozwiązujesz go za pomocą bbox_inches="tight"argumentu:

plt.savefig('myfile.png', bbox_inches = "tight")
Guido
źródło
2
@Guido uratował dzień
pcko1
7

Umieszczenie plot.tight_layout()po wszystkich zmianach na wykresie, tuż przed show()lub savefig()rozwiąże problem.

Armin Okić
źródło
1
To nie robi miejsca dla dolnej części fabuły, ale raczej przeskalowuje całą fabułę, co może w niektórych przypadkach (jak moja) sprawić, że fabuła wygląda naprawdę dziwnie.
89f3a1c
6

plt.autoscale() pracował dla mnie.

dgoodman1
źródło
5

Możesz również ustawić niestandardowe wypełnienie jako domyślne w swoim $HOME/.matplotlib/matplotlib_rcw następujący sposób. W poniższym przykładzie zmodyfikowałem zarówno dolne, jak i lewe dopełnienie:

# 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
...
Мати Тернер
źródło