【问题标题】:Figure appearance is not preserved when its axes are added to new figure将其轴添加到新图形时,图形外观不会保留
【发布时间】:2014-09-03 21:16:34
【问题描述】:

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

我做错了什么?

提前感谢您的帮助。

M

【问题讨论】:

    标签: python matplotlib axes multiple-axes


    【解决方案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])
    

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

    【讨论】:

    • 嗨,约翰,感谢您的好主意,尽管它概述了一种不同的方法。我想先生成图形然后将它们全部集中在一个复杂图形中的主要原因是因为一些独立的图形是由长脚本生成的,这可能需要很长时间的运行时间。所以想法是先保存数字,然后从文件中打开它们并将它们集中在一个数字中。我真的不明白为什么这是不可能的。我找到了this...但我不知道如何正确地重塑我的身材
    猜你喜欢
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2020-09-10
    • 2018-05-09
    相关资源
    最近更新 更多