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


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.


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.


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

2
@Guido uratował dzień
pcko1

7

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


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


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
...
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.