2014-09-03 34 views
0

我有幾個獨立腳本生成的圖形,我想用每個面板的自定義軸(位置和大小)包含在一個複雜圖形中。我知道這種方法似乎尚未得到matplotlib的支持,但我決定嘗試一下。將圖形的外觀添加到新圖形時不會保留

現在,我可以將每個圖形複製到我想要的面板中,但「複製」的圖形會以某種方式剪切並且軸會混亂。坦率地說,因爲我對matplotlib比較陌生,所以我不知道自己錯過了什麼(例如,在Matlab中,copyobj()會完成這個技巧)。

下面是示例代碼,我使用的測試:

def customfigure(flist,axlist): 
    # Margins 
    lm = 0.05 
    rm = 0.05 
    bm = 0.05 
    tm = 0.05 

    # basic grid 
    nrow = 2 
    ncol = 2 

    # rulers 
    hr = 0.02 
    vr = 0.02 

    # axis width 
    aw = (1-lm-rm-(ncol-1)*hr)/ncol 
    # axis height 
    ah = (1-tm-bm-(nrow-1)*vr)/nrow 

    # Make axis box 
    ax = [None]*(ncol*nrow) 
    ax[0] = [lm,bm,aw,ah] 
    ax[1] = [lm,bm+ah+vr,aw,ah] 
    ax[2] = [lm+aw+hr,bm,aw,ah] 
    ax[3] = [lm+aw+hr,bm+ah+vr,aw,ah] 

    fig = plt.figure(figsize=(10,6),dpi=80) 
    # Solution 1 
    for i in xrange(len(axlist)): 
     axlist[i].set_position(ax[i]) 
     axlist[i].set_figure(fig) 
     flist[i].delaxes(axlist[i])   
     fig.add_axes(axlist[i]) 

close('all') 
fig = [None]*4 
ax = [None]*4 
x = array([range(10)]) 

close('all') 
fig = [None]*4 
ax = [None]*4 

t = arange(0.0, 2.0, 0.01) 
color = ['k','r','g','b'] 
for i in xrange(4): 
    fig[i],ax[i] = plt.subplots() 
    s = sin(2*(i+1)*pi*t) 
    plt.plot(t, s,'-',color=color[i]) 
    show() 

customfigure(fig,ax) 

最後的數字,由customfigure建()(這很遺憾,我不能粘貼在這裏作爲一個新手)在這至少有兩個問題圖: (1) - 複製圖形的大小並不是我期望通過set_position()實例 (2) - 在集中在主圖中時的原始數字,似乎將數據範圍限制爲1.0(而x軸應高達2.0) (3) - 然後確定,軸的位置是完全擰緊的...

我做錯了什麼?

在此先感謝您的幫助。

中號

回答

1

我想這樣做的最自然的方式是創建自定義的軸,然後再對他們的直接打印。通過它的聲音,對於你來說,這將涉及到改變你的獨立腳本,以軸實例作爲參數,並對其進行繪圖(而不是使用狀態界面)。

這樣做將是從customfigure返回軸實例列表的方法之一:

for i in xrange(len(axlist)): 
    axlist[i] = fig.add_axes(ax[i]) 
return axlist 

然後你可以使用這些腳本中的主要部分上繪製:

color = ['k', 'r','g', 'b'] 
alist = customfigure() # (customfigure doesn't need to take any 
         # arguments now) 
for i in xrange(4): 
    s = np.sin(2*(i+1) * np.pi * t) 
    alist[i].plot(t, s, '-', color = color[i]) 

而且應該做你想做的。這種事情是我在做自定義地塊時傾向於做的事情。

如果您確實不想更改獨立腳本,則可以使用plt.sca將狀態機的當前軸設置爲您創建的座標軸,從而在狀態界面中實現同樣的效果並想要陰謀。這將涉及做這樣的事情:

color = ['k', 'r','g', 'b'] 
alist = customfigure() # (customfigure doesn't need to take any 
         # arguments now) 
for i in xrange(4): 
    s = np.sin(2*(i+1) * np.pi * t) 
    plt.sca(alist[i]) 
    plt.plot(t, s, '-', color = color[i]) 

希望這有助於和可以理解!

+0

嗨,約翰,感謝你的好主意,雖然它概述了一種不同的方法。我想先製作數字然後把它們全部放在一個複雜的圖形中的主要原因是因爲一些獨立的數字是由長腳本產生的,這可能需要很長的運行時間。因此,這個想法是首先保存數字,然後從文件中打開它們並將它們集中在一個數字中。我不明白爲什麼這是不可能的。我發現[this](https://www.mail-archive.com/[email protected]/msg06032.html)...但我不知道如何正確地重塑我的數字 – maurizio 2014-09-06 04:15:25