Python: subplot внутри цикла: первая панель отображается в неправильном положении

Я новичок в Python и пришел с большей точки зрения Matlab. Я пытаюсь сделать серию подстроек из 2 x 5 панелей. Мой подход до сих пор заключается в том, чтобы преобразовать (до некоторой степени) мой код Matlab в Python и построить мои подзадачи в цикле. Относительная часть кода выглядит следующим образом:

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

Как новичок в этом форуме, мне кажется, что мне не разрешено прикреплять полученный образ. Однако, исходя из моего индексации в коде как "temp", результирующая компоновка панелей размером 2 x 5:

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

Однако, я хочу

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

То есть первая панель (250) появляется в последней позиции, где я думаю, что должно быть 259. И, кажется, 251, где я хочу разместить 250. Кажется, что все они находятся в правильной последовательности, только круговой сдвиг на один.

Я знаю, что это будет что-то очень глупое, но оцените любую помощь, которую вы можете дать.

Спасибо заранее.

Ответ 1

Используя ваш код с некоторыми случайными данными, это будет работать:

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

Макет не слишком пуст, но из-за ваших текущих настроек (figsize, wspace и т.д.).

enter image description here

Ответ 2

Проблема заключается в использовании индексации subplot. Подсчеты подсчитываются начиная с 1! Таким образом, ваш код должен читать

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

Обратите внимание на изменение строки, в которой вы вычисляете temp

Ответ 3

В основном то же решение, что и Rutger Kassies, но с использованием более пифонического синтаксиса:

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