Due to repeated emails by Eric Firing about how something like this
would be nice to have, I finally got around to packaging a little
utility I wrote. I uploaded it to the MPL source repository. The basic
idea is to create a layout engine for matplotlib. Not wanting to
(re-)invent an API, I decided simply to imitate the layout engine I knew
best, which is wxPython.
Disclaimer: This isn't bug-free, complete, or well-documented and this
announcement should merely be taken as a call to "commence hacking now".
That being said, I've used mplsizer for several figures for publication,
so I don't consider it that bad or incomplete, either.
Anyhow, the source code, licensed under the MIT license, is available at:
https://svn.sourceforge.net/svnroot/matplotlib/trunk/toolkits/mplsizer
One note: aside from depending on matplotlib, this requires setuptools.
Sorry to those of you who hate setuptools, but it simply gives me tools
that make my life easier. If you want to change mplsizer to not require
setuptools, that's fine by me, but we should keep it setuptools compatible.
Here's the last part of the demo_basic.py script. "fig" is a matplotlib
Figure instance, "a","b","b2", and "lowest" are matplotlib Axes instances.
# Now perform the mplsizer stuff
import matplotlib.toolkits.mplsizer as mplsizer
frame = mplsizer.MplSizerFrame( fig )
sizer = mplsizer.MplBoxSizer()
frame.SetSizer(sizer)
sizer.Add(a,name='a',expand=1)
sizer.Add(b,name='b',all=0,left=1,border=0.2)
sizer.Add(b2,name='b2')
if more_plots:
hsizer = mplsizer.MplBoxSizer(orientation='horizontal')
hsizer.Add(c,name='c',option=1,align_bottom=1)
hsizer.Add(d,name='d',align_centre=1)
sizer.Add(hsizer,all=0,bottom=1,border=0.5,expand=1,option=1)
frame.Layout() # triggers layout
# It's naughty to use the private attribute, but, hey, this is for
# debugging only, so it's OK, right?
lowest.set_position(hsizer._rect)
pylab.show()