2014-04-17 15 views
6

Tôi muốn tạo một hình bao gồm chín điểm con. Tôi thực sự ghét một thực tế là tôi cần phải tạo ra ax1 để ax9 riêng biệt vì vậy tôi tạo ra một vòng lặp for để làm như vậy. Tuy nhiên, khi tôi muốn bao gồm một thanh màu, thanh màu được đặt đúng vị trí của subplot cuối cùng. Điều này cũng được minh họa trong hình sau:Định vị thanh màu sai khi sử dụng các vị trí con (matplotlib)

enter image description here

gì đang xảy ra sai và làm thế nào tôi có thể sửa lỗi này?

Hình ảnh đã được tạo ra với đoạn mã sau:

import numpy 
import layout 
import matplotlib.pylab as plt 

data = numpy.random.random((10, 10)) 

test = ["ax1", "ax2", "ax3", "ax4", "ax5", "ax6", "ax7", "ax8", "ax9"] 

fig = plt.figure(1) 

for idx in range(len(test)): 
    vars()[test[idx]] = fig.add_subplot(3, 3, (idx + 1)) 

im = ax1.imshow(data) 
plt.colorbar(im) 

im2 = ax3.imshow(data) 
plt.colorbar(im2) 

plt.show() 

Trả lời

3

Tôi tìm thấy câu trả lời cho câu hỏi của tôi, kết quả là colorbar đúng vs khoảng cách âm mưu phụ. Lưu ý rằng nếu khoảng cách giữa subplot và colorbar không quan trọng, câu trả lời của Molly là chính xác.

import numpy 
import layout 
import matplotlib.pylab as plt 
from mpl_toolkits.axes_grid1 import make_axes_locatable 

data = numpy.random.random((10, 10)) 

test = ["ax1", "ax2", "ax3", "ax4", "ax5", "ax6", "ax7", "ax8", "ax9"] 

fig = plt.figure(1) 

for idx in range(len(test)): 
    vars()[test[idx]] = fig.add_subplot(3, 3, (idx + 1)) 
    divider = make_axes_locatable(vars()[test[idx]]) 
    vars()["c" + test[idx]] = divider.append_axes("right", size = "5%", pad = 0.05) 


im1 = ax1.imshow(data) 
plt.colorbar(im1, cax = cax1) 

im2 = ax2.imshow(data) 
plt.colorbar(im2, cax = cax2) 

im3 = ax3.imshow(data) 
plt.colorbar(im3, cax = cax3) 

im4 = ax4.imshow(data) 
plt.colorbar(im4, cax = cax4) 

im5 = ax5.imshow(data) 
plt.colorbar(im5, cax = cax5) 

im6 = ax6.imshow(data) 
plt.colorbar(im6, cax = cax6) 

im7 = ax7.imshow(data) 
plt.colorbar(im7, cax = cax7) 

im8 = ax8.imshow(data) 
plt.colorbar(im8, cax = cax8) 

im9 = ax9.imshow(data) 
plt.colorbar(im9, cax = cax9) 

plt.show() 

Điều này dẫn đến:

enter image description here

10

colorbar có một đối ax các "đối tượng trục mẹ (s) mà từ đó không gian cho một trục colorbar mới sẽ bị đánh cắp." Trong mã của bạn, bạn có thể làm điều gì đó như thế này để thêm thanh màu bên cạnh một trục:

im = ax1.imshow(data) 
plt.colorbar(im, ax = ax1) 
+0

Đó là một chút thanh lịch hơn so với giải pháp tôi tìm thấy. Tuy nhiên, khoảng cách giữa subplot và colorbar là khá lớn. Bất kỳ ý tưởng? –

+0

Hãy thử plt.tight_layout() – Molly

0

Câu trả lời của Dude thật tuyệt vời. Tuy nhiên, tôi muốn tránh sao chép-dán bằng cách sử dụng:

import numpy 
import matplotlib.pylab as plt 
from mpl_toolkits.axes_grid1 import make_axes_locatable 

data = numpy.random.random((10, 10)) 

test = ["ax1", "ax2", "ax3", "ax4", "ax5", "ax6", "ax7", "ax8", "ax9"] 

fig = plt.figure(1) 

for idx in range(len(test)): 
    vars()[test[idx]] = fig.add_subplot(3, 3, (idx + 1)) 
    divider = make_axes_locatable(vars()[test[idx]]) 
    vars()["c" + test[idx]] = divider.append_axes("right", size = "5%", pad = 0.05) 

    vars()["im" + str(idx)] = vars()[test[idx]].imshow(data) 
    plt.colorbar(vars()["im" + str(idx)], cax = vars()["c" + test[idx]]) 

plt.show() 

Kết quả là giống nhau.

+0

Cũng có thể tạo số ô tùy chỉnh, bằng cách tạo danh sách kiểm tra cho số ô đã cho. –

Các vấn đề liên quan