我有几个由独立脚本生成的图形,我想在一个复杂的图形中混合每个面板的自定义轴(位置和大小)。我知道到目前为止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) - 然后确定,轴的位置完全拧紧......
我做错了什么?
提前感谢您的帮助。
中号
答案 0 :(得分: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])
希望这有帮助并且可以理解!