2013-06-20 4 views
10

Jestem całkiem nowy w Pythonie i pochodzę z bardziej matlabowego punktu widzenia. Próbuję utworzyć serię wątków 2 x 5 panelu contourf. Do tej pory moje podejście polegało na zamianie (do pewnego stopnia) mojego kodu Matlab na Python i wykreślenie moich wątków w pętli. Relavent część kodu wygląda następująco:Python: subplot w pętli: pierwszy panel pojawia się w niewłaściwej pozycji

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

Jako początkujących na tym forum, i nie wydaje się, aby móc dołączyć obraz wynikowy. Jednak, idąc za moim indeksowania w kodzie jako 'temp' powstałego układu The 2 x 5 paneli jest:

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

Jednak to, co chcę jest

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

Oznacza to, że pierwszy panel (250) pojawia się na ostatniej pozycji, gdzie według mnie powinien być 259. A 251 wydaje się być tam, gdzie chcę umieścić 250. Wygląda na to, że są we właściwej kolejności, po prostu przesunięte w kółko o jeden.

Wiem, że to będzie coś bardzo głupiego, ale doceniamy każdą pomoc, jaką możesz dać.

Z góry dziękuję.

Odpowiedz

25

Używając kodu z niektórych danych losowych, to będzie działać:

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

Układ jest poza oczywiście nieco brudny, ale to z powodu aktualnych ustawień (na figsize, wspace etc).

enter image description here

+1

Dziękuję za szybką odpowiedź! Twoje zmiany zadziałały idealnie i uprościły mój kod nieco :) Wielkie dzięki! –

4

Problemem jest indeksowania subplot jest używany. Subplots są liczone od 1! Twój kod musi zatem czytać

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

Uwaga zmiana w wierszu, w którym obliczenia temp

+0

Dziękuję Davidowi za szybką odpowiedź również ... Wprowadziłem tę zmianę, ale zasugerowałeś, że chociaż wszystkie panele pojawiają się we właściwej kolejności, ostateczne okno panelu staje się węższe i gniecione z jakiegoś powodu. –

+0

@russelljohnston, czy dodałeś polecenie 'colorbar'? To zawsze będzie kradło przestrzeń z ostatniego zestawu osi – esmit

+0

HI Esmit, nie dodałem polecenia paska kolorów. Ponieważ nie mam na to czasu, poprawa dostarczona przez Rutgera oznacza, że ​​nie zbadałem pierwotnego problemu z pierwotnym podejściem. Dzięki. –

0

zasadzie takie samo rozwiązanie przewidziane przez Rutger Kassies, ale stosując bardziej pythonic składnię:

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)) 
Powiązane problemy