2013-06-20 17 views
10

Tôi khá mới với Python và đến từ một quan điểm của Matlab hơn. Tôi đang cố gắng tạo một chuỗi các ô con đường viền 2 x 5 bảng điều khiển. Cách tiếp cận của tôi cho đến nay đã được chuyển đổi (đến một mức độ nhất định) mã Matlab của tôi để Python và âm mưu của tôi subplots trong vòng một. Phần relavent của mã trông giống như sau:Python: subplot trong vòng lặp: bảng đầu tiên xuất hiện ở vị trí sai

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

Là một người mới vào diễn đàn này, tôi dường như không được phép đính kèm hình ảnh kết quả. Tuy nhiên, đi theo chỉ mục của tôi trong các mã như 'tạm thời' bố trí kết quả của 2 x 5 tấm là:

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

Tuy nhiên, những gì tôi muốn là

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

Đó là, người đầu tiên bảng điều khiển (250) xuất hiện ở vị trí cuối cùng, nơi tôi sẽ nghĩ 259 nên được. Và 251 dường như là nơi tôi muốn 250 được đặt. Tất cả chúng dường như theo đúng trình tự, chỉ tròn một lần.

Tôi biết điều này sẽ rất ngớ ngẩn, nhưng đánh giá cao bất kỳ trợ giúp nào bạn có thể cung cấp.

Cảm ơn bạn trước.

Trả lời

25

Sử dụng mã của bạn với một số dữ liệu ngẫu nhiên, điều này sẽ làm việc:

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

Việc bố trí là tắt khóa học một chút lộn xộn, nhưng đó là bởi vì các thiết lập hiện tại của bạn (các figsize, wspace vv).

enter image description here

+1

Cảm ơn đã trả lời nhanh chóng! Thay đổi của bạn đã làm việc một cách hoàn hảo và đơn giản hóa mã của tôi một chút :) Rất cám ơn !! –

4

Vấn đề là việc lập chỉ mục subplot đang sử dụng. Subplots được tính bắt đầu với 1! Mã của bạn do đó cần phải đọc

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

Lưu ý sự thay đổi trong dòng nơi bạn tính toán temp

+0

Cảm ơn David đã trả lời nhanh ... Tôi đã thực hiện thay đổi như bạn đã đề xuất, tuy nhiên, mặc dù các bảng sau đó xuất hiện theo đúng thứ tự, cửa sổ bảng điều khiển cuối cùng trở nên hẹp hơn và bị đè bẹp vì một lý do nào đó. –

+0

@russelljohnston, bạn đã thêm lệnh 'colorbar' chưa? Điều này sẽ luôn luôn lấy cắp không gian từ bộ trục cuối cùng – esmit

+0

HI Esmit, không tôi không thêm lệnh colorbar. Kể từ khi tôi ngắn về thời gian với điều này, sửa chữa mà Rutger cung cấp có nghĩa là tôi havent khám phá vấn đề tiềm ẩn với cách tiếp cận ban đầu của tôi. Cảm ơn. –

0

Về cơ bản cùng một giải pháp theo quy định của Rutger Kassies, nhưng sử dụng một cú pháp pythonic hơn:

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