2011-01-20 35 views
19

Tôi gặp vấn đề với vẽ nhiều ô con. Tôi muốn thiết lập tỷ lệ khung hình vật lý của các subplots thành một giá trị cố định. Trong ví dụ của tôi, tôi có 12 ô con (4 hàng và 3 cột) trên hình A4 ngang. Có tất cả các subplots được đặt độc đáo trên toàn bộ con số, và cho tất cả các subplots chiều cao là gần bằng với chiều rộng.matplotlib - subplots với tỷ lệ co cố định

Nhưng nếu tôi thay đổi bố cục của hình của tôi thành dọc, các ô con sẽ được kéo theo chiều dọc. Và đây chính là điều không nên xảy ra. Tôi muốn có cùng chiều cao và chiều rộng của các ô phụ như trên hình phong cảnh. Có khả năng tỷ lệ khung hình của các ô con vẫn giữ nguyên không?

Cảm ơn trước, Peter

EDIT: Tôi đã tìm thấy một workaround. Nhưng điều này chỉ hoạt động cho các trục không logarit ...

aspectratio=1.0 
ratio_default=(ax.get_xlim()[1]-ax.get_xlim()[0])/(ax.get_ylim()[1]-ax.get_ylim()[0]) 
ax.set_aspect(ratio_default*aspectratio) 

Trả lời

15

Trên thực tế, những gì bạn đang mong muốn là khá đơn giản ... Bạn chỉ cần chắc chắn rằng adjustable được thiết lập để 'box' trên trục của bạn, và bạn có tỷ lệ co được thiết lập cho các trục (bất kỳ thứ gì khác ngoài 'auto').

Bạn có thể thực hiện việc này với số tiền adjustable khi bạn tạo các phụ trang. Ngoài ra, bạn có thể thực hiện việc này sau khi tạo bằng cách gọi số ax.set_adjustable('box') hoặc gọi số ax.set_aspect(aspect, adjustable='box') (trong đó khía cạnh là 'equal' hoặc một số).

Bây giờ, bất kể hình được thay đổi kích thước như thế nào, các ô con sẽ duy trì cùng tỷ lệ khung hình.

Ví dụ:

import matplotlib.pyplot as plt 

fig = plt.figure() 
ax1 = fig.add_subplot(2,1,1, adjustable='box', aspect=0.3) 
ax2 = fig.add_subplot(2,1,2) 

ax1.plot(range(10)) 
ax2.plot(range(10)) 

plt.show() 

Bây giờ, so sánh như thế nào âm mưu phụ đầu phản ứng với thay đổi kích thước, so với cách thức âm mưu phụ đáy đáp ứng:


Cốt truyện ban đầu alt text

Đã đổi kích thước thành bố cục dọc: alt text

thay đổi kích thước để bố cục ngang: alt text

+0

Tôi đã sửa. Tốt để biết. –

+0

Xin chào! Cảm ơn vì đã trả lời. Thật không may, điều này chỉ thiết lập tỷ lệ khung hình của các trục của các ô con. Vì tôi có nhiều phạm vi khác nhau của các trục của mình, tôi sẽ phải đặt tỷ lệ khung hình này cho từng phụ con riêng lẻ.Vì vậy, những gì tôi muốn làm là đặt chiều cao và chiều rộng của các subplots của tôi (và không chỉ là các trục) đến một tỉ lệ cụ thể. –

3

workaround của bạn làm việc cho tôi. Sau khi âm mưu dữ liệu, tôi gọi hàm sau:

def fixed_aspect_ratio(ratio): 
    ''' 
    Set a fixed aspect ratio on matplotlib plots 
    regardless of axis units 
    ''' 
    xvals,yvals = gca().axes.get_xlim(),gca().axes.get_ylim() 

    xrange = xvals[1]-xvals[0] 
    yrange = yvals[1]-yvals[0] 
    gca().set_aspect(ratio*(xrange/yrange), adjustable='box') 
+0

Điều này làm việc tốt cho tôi. Tôi đã sửa đổi hàm để chấp nhận một đối số 'ax' để tôi có thể áp dụng nó cho các vị trí con. Tôi cũng thay thế 'gca(). Trục' bằng' ax' và 'gca()' bằng 'ax'. – Steve

1

Trong thư trả lời để nhận xét về các giải pháp không làm việc cho lô logarit trong chỉnh sửa cho câu hỏi ban đầu - bạn cần phải thích ứng như sau:

def fixed_aspect_ratio_loglog(ratio): 
    ''' 
    Set a fixed aspect ratio on matplotlib loglog plots 
    regardless of axis units 
    ''' 
    xvals,yvals = gca().axes.get_xlim(),gca().axes.get_ylim() 

    xrange = log(xvals[1])-log(xvals[0]) 
    yrange = log(yvals[1])-log(yvals[0]) 
    gca().set_aspect(ratio*(xrange/yrange), adjustable='box') 

(Thích ứng cho các ô semilog bây giờ phải rõ ràng)

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