2013-03-15 34 views
5

Dưới đây là hình tôi đã tạo với matplotlib. Vấn đề là khá rõ ràng - các nhãn trùng lặp và toàn bộ điều là một mớ hỗn độn không đọc được.Tôi có thể làm gì với các nhãn chồng chéo trong các ô con này?

enter image description here

tôi đã cố gắng gọi tight_layout cho mỗi âm mưu phụ, nhưng điều này bị treo kernel ipython-máy tính xách tay của tôi.

Tôi có thể làm gì để sửa bố cục? Các cách tiếp cận có thể chấp nhận bao gồm sửa xlabel, ylabel và tiêu đề cho mỗi subplot, nhưng cách tiếp cận khác (và có lẽ tốt hơn) sẽ là có một xlabel, ylabel và tiêu đề cho toàn bộ hình.

Đây là vòng lặp tôi đã sử dụng để tạo ra các ô phụ ở trên:

for i, sub in enumerate(datalist): 
    subnum = i + start_with 
    subplot(3, 4, i) 

    # format data (sub is a PANDAS dataframe) 
    xdat = sub['x'][(sub['in_trl'] == True) & (sub['x'].notnull()) & (sub['y'].notnull())] 
    ydat = sub['y'][(sub['in_trl'] == True) & (sub['x'].notnull()) & (sub['y'].notnull())] 

    # plot 
    hist2d(xdat, ydat, bins=1000) 
    plot(0, 0, 'ro') # origin 

    title('Subject {0} in-Trial Gaze'.format(subnum)) 
    xlabel('Horizontal Offset (degrees visual angle)') 
    ylabel('Vertical Offset (degrees visual angle)') 

    xlim([-.005, .005]) 
    ylim([-.005, .005]) 
    # tight_layout # crashes ipython-notebook kernel 

show() 

Cập nhật:

Được rồi, vì vậy ImageGrid có vẻ là con đường để đi, nhưng con số của tôi vẫn đang tìm kiếm một chút rung rinh:

enter image description here

Dưới đây là đoạn code tôi sử dụng:

fig = figure(dpi=300) 
grid = ImageGrid(fig, 111, nrows_ncols=(3, 4), axes_pad=0.1) 

for gridax, (i, sub) in zip(grid, enumerate(eyelink_data)): 
    subnum = i + start_with 

    # format data 
    xdat = sub['x'][(sub['in_trl'] == True) & (sub['x'].notnull()) & (sub['y'].notnull())] 
    ydat = sub['y'][(sub['in_trl'] == True) & (sub['x'].notnull()) & (sub['y'].notnull())] 

    # plot 
    gridax.hist2d(xdat, ydat, bins=1000) 
    plot(0, 0, 'ro') # origin 

    title('Subject {0} in-Trial Gaze'.format(subnum)) 
    xlabel('Horizontal Offset\n(degrees visual angle)') 
    ylabel('Vertical Offset\n(degrees visual angle)') 

    xlim([-.005, .005]) 
    ylim([-.005, .005]) 

show() 
+0

Có một ví dụ Cookbook: http://www.scipy.org/Cookbook/Matplotlib/Multiple_Subplots_with_One_Axis_Label (một số ví dụ, trên thực tế) –

+0

fyi: 'tight_layout' nên được gọi trên cá thể hình, không phải là trục. tuy nhiên, 'ImageGrid' là cách tốt nhất để đi, IMO –

+0

@PaulH, ack đúng. Đẹp bắt! Cảm ơn! Chỉnh sửa: mà nói, bạn sẽ nghĩ rằng nó sẽ nâng cao một ngoại lệ rõ ràng =/ – blz

Trả lời

3

Bạn muốn ImageGrid (tutorial).

dụ đầu tiên nhấc trực tiếp từ liên kết đó (và sửa đổi nhẹ):

import matplotlib.pyplot as plt 
from mpl_toolkits.axes_grid1 import ImageGrid 
import numpy as np 

im = np.arange(100) 
im.shape = 10, 10 

fig = plt.figure(1, (4., 4.)) 
grid = ImageGrid(fig, 111, # similar to subplot(111) 
       nrows_ncols = (2, 2), # creates 2x2 grid of axes 
       axes_pad=0.1, # pad between axes in inch. 
       aspect=False, # do not force aspect='equal' 
       ) 

for i in range(4): 
    grid[i].imshow(im) # The AxesGrid object work as a list of axes. 

plt.show() 
+0

tuyệt vời! Tôi sẽ thử điều này sau vài phút! – blz

+0

Tôi đã thử sử dụng 'ImageGrid', như bạn đã đề xuất, nhưng tôi vẫn nhận được kết quả lạ. Trục của tôi có kích thước không đúng và xlims của tôi và ylims không được đưa vào tài khoản - Tôi đã cập nhật câu hỏi của tôi với mã ví dụ và một con số mới. Có suy nghĩ gì không? – blz

+0

@blz xem chỉnh sửa. – tacaswell

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