web-dev-qa-db-fra.com

Python: sous-intrigue dans une boucle: le premier panneau apparaît dans la mauvaise position

Je suis assez nouveau pour Python et je viens d'un point de vue plus Matlab. J'essaie de faire une série de sous-tracés de contourf de 2 x 5 panneaux. Mon approche jusqu'à présent a été de convertir (en un certain degré) mon code Matlab à Python et tracer mes sous-tracés dans une boucle. La partie relavente du code ressemble à ceci:

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

En tant que débutant sur ce forum, je ne semble pas être autorisé à joindre l'image résultante. Cependant, selon mon indexation dans le code comme "temp", la disposition résultante des panneaux 2 x 5 est:

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

Cependant, ce que je veux c'est

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

Autrement dit, le premier panneau (250) apparaît dans la dernière position où je pense que 259 devrait être. Et 251 semble être l'endroit où je veux placer 250. Ils semblent tous être dans le bon ordre, juste décalés d'un cercle.

Je sais que ce sera quelque chose de très stupide, mais apprécie toute aide que vous pouvez apporter.

Merci d'avance.

19
russell johnston

En utilisant votre code avec des données aléatoires, cela fonctionnerait:

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

La disposition est bien sûr un peu désordonnée, mais c'est à cause de vos paramètres actuels (figsize, wspace, etc.).

enter image description here

51
Rutger Kassies

Le problème est l'indexation que subplot utilise. Les sous-parcelles sont comptées en commençant par 1! Votre code doit donc être lu

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

Notez le changement dans la ligne où vous calculez temp

6
David Zwicker

Fondamentalement, la même solution que celle fournie par Rutger Kassies , mais en utilisant une syntaxe plus Pythonic:

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))
3
Tim Hoffmann