2011-01-20 14 views
19

Ho un problema con la stampa di più sottotrame. Vorrei impostare il rapporto di aspetto fisico delle sottotrame su un valore fisso. Nel mio esempio ho 12 sottotrame (4 righe e 3 colonne) su una figura A4 orizzontale. Lì tutte le sottotrame sono posizionate correttamente sull'intera figura, e per tutte le sottotrame l'altezza è quasi uguale alla larghezza.matplotlib - sottotrame con proporzioni fisse

Ma se modifico il layout della mia figura in verticale, le sottotrame sono allungate verticalmente. E questo è esattamente ciò che non dovrebbe accadere. Mi piacerebbe avere la stessa altezza e larghezza delle sottotrame come nella figura del paesaggio. C'è la possibilità che le proporzioni delle sottotrame rimangano le stesse?

Grazie in anticipo, Peter

EDIT: ho trovato una soluzione. Ma questo funziona solo per gli assi non logaritmiche ...

aspectratio=1.0 
ratio_default=(ax.get_xlim()[1]-ax.get_xlim()[0])/(ax.get_ylim()[1]-ax.get_ylim()[0]) 
ax.set_aspect(ratio_default*aspectratio) 

risposta

15

In realtà, quello che hai intenzione è abbastanza semplice ... Hai solo bisogno di fare in modo che adjustable è impostato su 'box' sui vostri assi, e si avere un rapporto aspetto impostato per gli assi (qualsiasi valore diverso da 'auto').

È possibile eseguire questa operazione con il kwarg adjustable durante la creazione delle sottotrame. In alternativa, puoi farlo dopo la creazione chiamando ax.set_adjustable('box') o chiamando ax.set_aspect(aspect, adjustable='box') (dove l'aspetto è 'equal' o un numero).

Ora, indipendentemente da come viene ridimensionata la figura, le sottotrame mantengono lo stesso rapporto di aspetto.

Ad esempio:

import matplotlib.pyplot as plt 

fig = plt.figure() 
ax1 = fig.add_subplot(2,1,1, adjustable='box', aspect=0.3) 
ax2 = fig.add_subplot(2,1,2) 

ax1.plot(range(10)) 
ax2.plot(range(10)) 

plt.show() 

Ora, confrontare come la sottotrama superiore risponde al ridimensionamento, rispetto a come la sottotrama fondo risponde:


La trama iniziale alt text

Ridimensionato su un layout verticale: alt text

ridimensionata per un layout orizzontale: alt text

+0

Sono corretto. Buono a sapersi. –

+0

Ciao! Grazie per la tua risposta. Sfortunatamente, questo imposta solo le proporzioni degli assi delle sottotrame. Dato che ho molte diverse gamme dei miei assi, dovrei impostare questo rapporto aspetto per ogni sottotrama individualmente.Quindi quello che volevo fare è impostare l'altezza e la larghezza delle mie sottotrame (e non solo degli assi) su un rapporto aspetto specifico. –

3

tua soluzione funziona per me. Dopo aver tracciato i dati, che io chiamo la seguente funzione:

def fixed_aspect_ratio(ratio): 
    ''' 
    Set a fixed aspect ratio on matplotlib plots 
    regardless of axis units 
    ''' 
    xvals,yvals = gca().axes.get_xlim(),gca().axes.get_ylim() 

    xrange = xvals[1]-xvals[0] 
    yrange = yvals[1]-yvals[0] 
    gca().set_aspect(ratio*(xrange/yrange), adjustable='box') 
+0

Questo ha funzionato bene per me. Ho modificato la funzione per accettare un argomento 'ax' in modo che potessi applicarlo alle sottotrame. Ho anche sostituito 'gca(). Axes' con' ax' e 'gca()' con 'ax'. – Steve

1

In risposta alla osservazione circa la soluzione non funziona per trame logaritmiche nella modifica alla domanda iniziale - è necessario per adattare come segue:

def fixed_aspect_ratio_loglog(ratio): 
    ''' 
    Set a fixed aspect ratio on matplotlib loglog plots 
    regardless of axis units 
    ''' 
    xvals,yvals = gca().axes.get_xlim(),gca().axes.get_ylim() 

    xrange = log(xvals[1])-log(xvals[0]) 
    yrange = log(yvals[1])-log(yvals[0]) 
    gca().set_aspect(ratio*(xrange/yrange), adjustable='box') 

(L'adattamento per le trame di semilogbbe dovrebbe essere ovvio)

Problemi correlati