2012-11-22 11 views
5

meteogramLa creazione di sottotrame con forme diverse in matplotlib

Sto cercando di creare una figura con più sottotrame molto simile a questo meteogramma in matplotlib. Avrò bisogno di più sottotrame di altezze variabili (tutte della stessa larghezza, ma alcune saranno "magre" e alcune saranno "più grasse"). Proprio come l'immagine sopra, alcune sottotrame devono essere grandi e alcune devono essere piccole, ma devono essere abbastanza grandi da trasmettere informazioni utili indipendentemente da quante sottotrame ci siano.

Quando creo un sottotramo come pyplot.subplot (2,1,1) ha le proporzioni di cui ho bisogno, ma se aumento il numero di righe (ad es. Sottotrama (3,1,1)) la sottotrama diventa "troppo magro". Avrò bisogno di adattare una mezza dozzina di questi grafici su una figura, ma diventeranno troppo "piccoli" se comincio ad inserire altre sottotrame sulla figura.

In parole semplici, una figura come questo meteogramma è possibile in matplotlib senza ricucire insieme più immagini? Queste immagini verranno restituite, su richiesta dell'URL, da un server, quindi tecnicamente è possibile, ma se posso risolvere questo problema nella libreria che sarebbe preferibile.

La documentazione di matplotlib è fantastica, ma sembra che matplotlib sia sintonizzato per fornire sottostrutture con lo stesso rapporto di aspetto anziché consentire di fornire sottotrame con proporzioni arbitrarie all'aumentare del numero di sottotrame. Non riesco a trovare un singolo esempio sulla rete di diverse dimensioni di sottotrama.

+0

So che questa è una domanda molto vecchia. Ma non ha potuto resistere a chiedere questo. Lo script del tuo meteogramma è attivo e funzionante? È concesso in licenza con GPL? –

+0

Purtroppo no. Come spesso accade nella mia esperienza, il progetto è stato demolito. Ho riformattato il disco rigido con questo codice, quindi è perso per sempre. Scusate. – user1844160

risposta

6

È possibile avere il pieno controllo del posizionamento degli assi dandogli un rettangolo di selezione in coordinate normalizzate (in costruzione). Il formato è [sinistra, alto, larghezza, altezza].

Un esempio di come vorrei andare sulla configurazione della figura:

import matplotlib.pyplot as plt 


left = 0.1 
width = 0.8 

ax1 = plt.axes([left, 0.5, width, 0.45]) 
ax2 = plt.axes([left, 0.3, width, 0.19]) 
ax3 = plt.axes([left, 0.2, width, 0.09], sharex=ax2) 
ax4 = plt.axes([left, 0.1, width, 0.09], sharex=ax2) 

# ticks at the top of the top plot 
ax1.xaxis.tick_top() 

# remove ticks for ax2 and ax3 
ax2.xaxis.set_visible(False) 
ax3.xaxis.set_visible(False) 

# only put ticks on the bottom of ax4 
ax4.xaxis.tick_bottom() 

plt.show() 

ho aggiunto alcune funzionalità che si potrebbe trovare utile (rimozione della parte superiore zecche, condividendo le asse X, spostando le zecche al cima di un asse).

Il risultato:

Example output

HTH

+0

Questo è bello. Con qualche codice aggiuntivo, è possibile dare alcuni parametri di dimensione come input e restituire il riquadro di delimitazione del layout come output! – heltonbiker

+0

Grazie per la risposta. Questo e 'esattamente quello che stavo cercando. Mentre stavo testando il tuo codice, ho anche cercato come salvare le immagini con proporzioni diverse (dimensioni xey) e tra queste due tecniche ho tutto ciò di cui ho bisogno. Grazie ancora. – user1844160

2

È possibile utilizzare Gridspec o subplot2grid. Ho scoperto che più tardi è più naturale da usare, ma è una preferenza personale. Inoltre, la risposta di Pelson è ancora un altro modo per farlo.

Dai uno sguardo ai due blocchi di codice più in basso in this example.

+0

Apprezzo la risposta. Ne esaminerò sicuramente questi. – user1844160