Hi,
Jae-Joon Lee <lee.j.joon@...83...> writes:
I had a few off-list conversation with Alan, and I'm also quite agree
with him for this issue.
[...]
issue 2) It is not easy (actually impossible) to make an axes
spanning multiple cells.
Regarding this 2nd issue, I appreciated long ago the flexibility and ease-of-use
offered by super-mongo WINDOW command (e.g.
SM). Basically, this would be
the same as accepting a tuple as plotNum argument in matplotlib subplot(numRows,
numCols, plotNum) to specify the extent of the composed subplot in terms of
atomic subplots, e.g.
ax1 = subplot(2,2,(1,3))
ax2 = subplot(2,2,2)
ax3 = subplot(2,2,4)
would produce the following layout:
···
+-------+-------+
> ax2 |
> >
ax1 +-------+
> ax3 |
> >
+-------+-------+
or
ax1 = subplot(3,3,(1,5))
ax2 = subplot(3,3,(7,9))
ax3 = subplot(3,3,(3,6))
for
+-------+---+
> >
ax1 |ax3|
> >
+-------+---+
ax2 |
+-----------+
My current naive implementation is the following:
def add_axes(fig, nrow, ncol, extent, **kwargs):
pars = fig.subplotpars
figW = pars.right-pars.left # Fig size
figH = pars.top-pars.bottom
subW = figW / (ncol + pars.wspace*(ncol-1)) # Sub-axes size
subH = figH / (nrow + pars.hspace*(nrow-1))
sepW = pars.wspace*subW # Separations
sepH = pars.hspace*subH
axL,axR,axB,axT = 1,0,1,0
for num in extent:
assert 0<num<=nrow*ncol
irow, icol = divmod(num-1, ncol)
subL = pars.left + icol*(subW + sepW)
subB = pars.top - (irow+1)*subH - irow*sepH
axL = min(axL,subL)
axR = max(axR,subL+subW)
axB = min(axB,subB)
axT = max(axT,subB+subH)
axW = axR-axL
axH = axT-axB
return fig.add_axes([axL,axB,axW,axH], **kwargs)
fig = figure()
ax1 = add_axes(fig,3,3,(1,5))
ax2 = add_axes(fig,3,3,(7,9))
ax3 = add_axes(fig,3,3,(3,6))
ax1.plot(randn(10),'b.')
ax2.plot(randn(10),'r.')
ax3.plot(randn(10),'g.')
draw()
Cheers.