1

我有几个由独立脚本生成的图形,我想将它们集中在一个复杂的图形中,每个面板都有自定义轴(位置和大小)。我知道到目前为止 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) - 然后好的,轴的位置完全拧紧了。 ..

我究竟做错了什么?

在此先感谢您的帮助。

4

1 回答 1

2

我认为最自然的方法是首先创建自定义轴,然后直接在它们上绘制。从它的声音来看,对您而言,这将涉及更改您的独立脚本以将轴实例作为参数并在其上进行绘图(而不是使用有状态的接口)。

这样做的一种方法是从以下位置返回轴实例列表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])

希望这会有所帮助并且可以理解!

于 2014-09-04T08:18:27.417 回答