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