Perché la mia xlabel è tagliata nel mio diagramma matplotlib?


303

Sto pianificando un set di dati usando matplotlibdove ho una xlabel che è abbastanza "alta" (è una formula resa in TeX che contiene una frazione e quindi ha l'altezza equivalente di un paio di righe di testo).

In ogni caso, la parte inferiore della formula viene sempre tagliata quando disegno le figure. Cambiare le dimensioni della figura non sembra aiutare questo, e non sono stato in grado di capire come spostare l'asse x "su" per fare spazio alla xlabel. Qualcosa del genere sarebbe una soluzione temporanea ragionevole, ma sarebbe bello avere un modo per far riconoscere automaticamente matplotlib che l'etichetta è tagliata e ridimensionare di conseguenza.

Ecco un esempio di cosa intendo:

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

mentre puoi vedere l'intera ylabel, la xlabel è tagliata in basso.

Nel caso si tratti di un problema specifico della macchina, lo sto eseguendo su OSX 10.6.8 con matplotlib 1.0.0


4
Puoi pubblicare su un sito di hosting di immagini e collegarlo qui.
AGF

1
Aiuta se è possibile pubblicare un codice di esempio minimalista che innesca questo problema. In questo modo, le persone possono capire e riprodurre il tuo problema più velocemente e avranno maggiori probabilità di aiutarti.
Denilson Sá Maia,

Il tuo codice funziona perfettamente (visualizza la formula completamente visibile) sul mio computer (ubuntu 11.04 64 bit). Forse è un problema specifico della macchina [come un carattere con informazioni dimensionali errate utilizzate nell'immagine?]. Potresti forse specificare il sistema che stai utilizzando nella tua domanda.
mac,

9
potresti anche provare plt.savefig("test.png",bbox_inches='tight'): stackoverflow.com/questions/21288062/…
Yibo Yang

Risposte:


475

Uso:

import matplotlib.pyplot as plt

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

per fare spazio all'etichetta.

Modificare:

Da quando ho dato la risposta, matplotlibha aggiunto la tight_layout()funzione. Quindi suggerisco di usarlo:

plt.tight_layout()

dovrebbe fare spazio alla xlabel.


141
Trovo piuttosto strano che si debba fare una chiamata extra per fare spazio a una parte essenziale di una trama. Qual è il ragionamento dietro questo?
un diverso ben

3
Solo per curiosità, perché hai gcf().subplots_adjustpiuttosto che plt.subplots_adjust? C'è una differenza?
ginepro

49
Cosa sono gcfe gca? Hai dimenticato di spiegare!
Colonnello Panic,

12
Mi sono trovato di fronte allo stesso problema e, sebbene tight_layout()abbia risolto il cutoff degli xlabel, sfortunatamente ha causato il taglio del mio ylabel (che non era stato tagliato prima). Tuttavia, il primo rimedio ( subplots_adjust(bottom=0.25)) ha funzionato bene. Grazie.
Scott H,

17
@ColonelPanic gcf()e gca()sono rispettivamente "get current figure" e "get current axes".
DrMisha,

150

Un'opzione semplice è quella di configurare matplotlib per regolare automaticamente le dimensioni della trama. Funziona perfettamente per me e non sono sicuro del perché non sia attivato per impostazione predefinita.

Metodo 1

Impostalo nel tuo file matplotlibrc

figure.autolayout : True

Vedi qui per maggiori informazioni sulla personalizzazione del file matplotlibrc: http://matplotlib.org/users/customizing.html

Metodo 2

Aggiorna rcParams durante il runtime in questo modo

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

Il vantaggio di usare questo approccio è che il tuo codice produrrà gli stessi grafici su macchine configurate diversamente.


Ho avuto dei problemi con barre dei colori troppo grandi quando ho usato questa opzione. Una possibile soluzione è discussa qui: matplotlib.org/users/tight_layout_guide.html
PiQuer

2
tight_layout crea confusione quando imposto dimensioni caratteri personalizzate (grandi!). Questo fa un lavoro molto migliore.
BenB,

L'aggiornamento di rcParams è stata davvero l'unica cosa che ha funzionato per me quando ho usato il backend pgf con LaTeX. (anche se rende la trama rettangolare, cosa che non mi dispiace)
h4nek

Solo questo ha funzionato per me; nessuno di tight_layout o box_inches ha funzionato
zed111

106

Nel caso in cui si desideri archiviarlo in un file, risolverlo usando l' bbox_inches="tight"argomento:

plt.savefig('myfile.png', bbox_inches = "tight")

2
@Guido ha salvato la giornata
pcko1 il

7

Mettere plot.tight_layout()dopo tutte le modifiche sul grafico, poco prima show()o savefig()risolverà il problema.


1
Questo non fa spazio al fondo della trama, ma ridimensiona l'intera trama, il che può in alcuni casi (come il mio) rendere la trama davvero strana.
89f3a1c,


5

È inoltre possibile impostare il riempimento personalizzato come predefinito nel modo $HOME/.matplotlib/matplotlib_rcseguente. Nell'esempio seguente ho modificato sia l'imbottitura inferiore che quella fuori dalla scatola:

# 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
...
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.