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

标签 python matplotlib axes multiple-axes

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

我做错了什么?

预先感谢您的帮助。

中号

最佳答案

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

实现此目的的一种方法是从 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 设置状态机的当前轴,在有状态接口(interface)中实现相同的效果是您创建并想要在其上绘图的轴。这将涉及做类似的事情:

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

希望这对您有所帮助并且易于理解!

关于python - 将轴添加到新图形时,不会保留图形外观,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25653799/

相关文章:

python - 给定 iterable,以概率 p 独立选择每个元素

python - 类型错误 : 'filter' object is not subscriptable

python - 获取模型 Doc2Vec 中向量的标签

opencv - 与 plt.show 一起使用时 cv2.imshow 不起作用

python - CDF累积分布函数误差

r - ggplot 辅助 y 轴使用 sec_axis 显示 z 分数

python - 如何删除颜色条

python - 使用 PyPlot 更改直方图的轴

python - 如何更新 matplotlib 中的绘图

python - 使用 Python 绘制 3D 轴上的平行标签