2013-03-15 75 views
5

下面是我用matplotlib創建的圖。問題非常明顯 - 標籤重疊,整個事情變得難以理解。我可以對這些子圖中的重疊標籤做些什麼?

enter image description here

我打過電話tight_layout每個插曲,但這個我崩潰的IPython筆記本內核。

我該如何解決佈局問題?可接受的方法包括修復每個子圖的xlabel,ylabel和標題,但另一種(也許更好)的方法是爲整個圖提供單個xlabel,ylabel和標題。

這是我用來產生上述次要情節的循環:

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

更新:

好了,所以ImageGrid似乎是要走的路,但我的身材還是找了一下靠不住的:

enter image description here

這是我使用的代碼:

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

有一個食譜例如:http://www.scipy.org/Cookbook/Matplotlib/Multiple_Subplots_with_One_Axis_Label(幾個實例中,實際上) – 2013-03-15 20:53:32

+0

fyi:應該在圖形實例上調用'tight_layout',而不是座標軸。然而,ImageGrid是最好的選擇,IMO – 2013-03-15 22:53:19

+0

@PaulH,對了。好的趕上!謝謝!編輯:說,你會認爲這會引發一個明確的例外=/ – blz 2013-03-15 23:10:29

回答

3

想要ImageGridtutorial)。

第一示例直接從該鏈接解除(和輕度修改):

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

真棒!我會在幾分鐘內嘗試這個! – blz 2013-03-15 21:13:31

+0

我嘗試使用'ImageGrid',正如你所建議的,但我仍然得到奇怪的輸出。我的座標軸尺寸不合適,我的xlims和ylims沒有考慮到 - 我已經用示例代碼和新圖更新了我的問題。有什麼想法嗎? – blz 2013-03-15 23:15:55

+0

@blz見編輯。 – tacaswell 2013-03-15 23:22:05

相關問題