2014-09-03 91 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