Python 将图形的轴添加到新图形时,不会保留图形外观

Python 将图形的轴添加到新图形时,不会保留图形外观,python,matplotlib,axes,multiple-axes,Python,Matplotlib,Axes,Multiple Axes,我有几个由独立脚本生成的图形,我想将它们组合成一个复杂的图形,每个面板都有自定义轴(位置和大小)。我知道到目前为止matplotlib似乎不太支持这种方法,但我决定尝试一下 现在,我可以将每个图形复制到我想要的面板中,但“复制”的图形不知何故被剪裁,轴被弄乱了。坦白地说,由于我对matplotlib比较陌生,我不知道我缺少了什么(例如,在Matlab中,copyobj()可以完成这个技巧) 以下是我用于测试的示例代码: def customfigure(flist,axlist): #

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

我做错了什么

提前感谢你的帮助


我认为最自然的方法是先创建自定义轴,然后直接在其上绘图。听上去,对您来说,这将涉及更改独立脚本,以将Axis实例作为参数,并在该实例上进行绘图(而不是使用state-ful接口)

一种方法是从
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
将状态机的当前轴设置为您创建并要打印的轴,在state ful界面中实现大致相同的功能。这将涉及到做以下事情:

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

希望这有帮助,是可以理解的

嗨,约翰,谢谢你的好主意,尽管它概括了一种不同的方法。我希望首先生成图形,然后将它们全部合并到一个复杂的图形中的主要原因是,一些独立的图形是由长脚本生成的,这可能需要较长的运行时间。所以,我的想法是先保存这些数字,然后从文件中打开它们,将它们合并成一个数字。我真的不明白为什么这不可能。我发现…但我不知道如何正确地重塑我的身材