2013-06-20 6 views
10

Sono abbastanza nuovo per Python e provengo da un punto di vista più Matlab. Sto provando a creare una serie di sottotrame di contorno di 2 x 5 pannelli. Il mio approccio finora è stato quello di convertire (in una certa misura) il mio codice Matlab in Python e tracciare le mie sottotrame all'interno di un ciclo. La parte relavent del codice simile a questo:Python: sottotrama all'interno di un ciclo: il primo pannello appare nella posizione errata

fig=plt.figure(figsize=(15, 6),facecolor='w', edgecolor='k') 
for i in range(10): 

    #this part is just arranging the data for contourf 
    ind2 = py.find(zz==i+1) 
    sfr_mass_mat = np.reshape(sfr_mass[ind2],(pixmax_x,pixmax_y)) 
    sfr_mass_sub = sfr_mass[ind2] 
    zi = griddata(massloclist, sfrloclist, sfr_mass_sub,xi,yi,interp='nn') 


    temp = 250+i # this is to index the position of the subplot 
    ax=plt.subplot(temp) 
    ax.contourf(xi,yi,zi,5,cmap=plt.cm.Oranges) 
    plt.subplots_adjust(hspace = .5,wspace=.001) 

    #just annotating where each contour plot is being placed 
    ax.set_title(str(temp)) 

Come un principiante a questo forum, io non sembra di poter allegare l'immagine risultante. Tuttavia, andando dal mio indicizzazione nel codice come 'temp' il layout risultante dei 2 x 5 pannelli è:

251 - 252 - 253 - 254 - 255 
256 - 257 - 258 - 259 - 250 

Tuttavia, quello che voglio è

250 - 251 - 252 - 253 - 254 
255 - 256 - 257 - 258 - 259 

Cioè, il primo panel (250) appare nell'ultima posizione in cui penso che 259 dovrebbe essere. E il 251 sembra essere dove voglio che vengano piazzati 250. Sembrano tutti nella sequenza corretta, spostati solo circolarmente da uno.

So che questo sarà qualcosa di molto sciocco, ma apprezzo qualsiasi aiuto tu possa dare.

Grazie in anticipo.

risposta

25

Utilizzando il codice con alcuni dati casuali, questo dovrebbe funzionare:

fig, axs = plt.subplots(2,5, figsize=(15, 6), facecolor='w', edgecolor='k') 
fig.subplots_adjust(hspace = .5, wspace=.001) 

axs = axs.ravel() 

for i in range(10): 

    axs[i].contourf(np.random.rand(10,10),5,cmap=plt.cm.Oranges) 
    axs[i].set_title(str(250+i)) 

Il layout è fuori rotta un po 'disordinato, ma questo è a causa delle impostazioni correnti (il figsize, wspace ecc).

enter image description here

+1

Grazie per la risposta rapida! Le tue modifiche hanno funzionato perfettamente e ho semplificato leggermente il mio codice :) Grazie mille !! –

4

Il problema è l'indicizzazione subplot sta usando. I sottotrami vengono contati iniziando con 1! Il codice deve quindi leggere

fig=plt.figure(figsize=(15, 6),facecolor='w', edgecolor='k') 
for i in range(10): 

    #this part is just arranging the data for contourf 
    ind2 = py.find(zz==i+1) 
    sfr_mass_mat = np.reshape(sfr_mass[ind2],(pixmax_x,pixmax_y)) 
    sfr_mass_sub = sfr_mass[ind2] 
    zi = griddata(massloclist, sfrloclist, sfr_mass_sub,xi,yi,interp='nn') 


    temp = 251+i # this is to index the position of the subplot 
    ax=plt.subplot(temp) 
    ax.contourf(xi,yi,zi,5,cmap=plt.cm.Oranges) 
    plt.subplots_adjust(hspace = .5,wspace=.001) 

    #just annotating where each contour plot is being placed 
    ax.set_title(str(temp)) 

nota il cambiamento di linea in cui si calcola temp

+0

Grazie David per la rapida risposta anche ... Ho apportato quella modifica come suggerito, tuttavia, anche se i pannelli appaiono tutti nell'ordine corretto, la finestra del pannello finale diventa più stretta e schiacciata per qualche motivo. –

+0

@russelljohnston, hai aggiunto un comando 'colorbar'? Questo ruberà sempre spazio dall'ultimo gruppo di assi – esmit

+0

HI Esmit, no non ho aggiunto il comando colorbar. Dato che sono a corto di tempo con questo, la correzione fornita da Rutger significa che non ho esplorato il problema sottostante con il mio approccio originale. Grazie. –

0

In sostanza la stessa soluzione fornita da Rutger Kassies, ma utilizzando una sintassi più divinatorio:

fig, axs = plt.subplots(2,5, figsize=(15, 6), facecolor='w', edgecolor='k') 
fig.subplots_adjust(hspace = .5, wspace=.001) 

data = np.arange(250, 260) 

for ax, d in zip(axs.ravel(), data): 
    ax.contourf(np.random.rand(10,10), 5, cmap=plt.cm.Oranges) 
    ax.set_title(str(d)) 
Problemi correlati