Hi, I'm using the method described on http://matplotlib.sourceforge.net/faq/howto_faq.html#howto-auto-adjust to automatically adjust my subplot figures to make room for my axis labels. I'm not drawing my graphs to the screen, but I'm instead outputting them to PNG files using a savefig("filename.png", dpi=100) call.
I'm on a Ubuntu 9.04 Jaunty Jackalope system, so I originally used the python-matplotlib package for convenience, which contains matplotlib 0.98.5.2. However, I later also needed the option to move my legend on top of my figure, which means that I had to upgrade to at least matplotlib 0.99.x since I would need the bbox_to_anchor kwarg for that. Naturally nothing higher than 0.98 is available for Ubuntu 9.04, so I went and installed MPL from source. That worked, until I discovered that now the draw_event no longer fires when I call savefig(). It still fires for show(), but for some reason, after installing from source, it no longer does. I made sure that I installed all of MPL's dependencies; the build report lists version numbers for all them where it didn't before, so I'm pretty sure those are all satisfied. Here's the test program I used, adapted directly from the sample code. I also tried adding in manual fig.canvas.draw() calls to try and trigger the event manually, which seemingly are all happily ignored. import matplotlib.pyplot as plt import matplotlib.transforms as mtransforms fig = plt.figure() ax = fig.add_subplot(111) ax.plot(range(10)) ax.set_yticks((2,5,7)) labels = ax.set_yticklabels(('really, really, really', 'long', 'labels')) def on_draw(event): print "on_draw" bboxes = [] for label in labels: bbox = label.get_window_extent() # the figure transform goes from relative coords->pixels and we # want the inverse of that bboxi = bbox.inverse_transformed(fig.transFigure) bboxes.append(bboxi) # this is the bbox that bounds all the bboxes, again in relative # figure coords bbox = mtransforms.Bbox.union(bboxes) if fig.subplotpars.left < bbox.width: # we need to move it over fig.subplots_adjust(left=1.1*bbox.width) # pad a little fig.canvas.draw() return False fig.canvas.mpl_connect('draw_event', on_draw) #plt.show() # this fires draw_event plt.savefig('delete_me.png', dpi=100) # this doesn't Convinced this was a bug, I then tried compiling a whole bunch of different versions from source to see what version it stopped working at. It didn't work for any of them, including the 0.98.5.x builds. Finally, I tried grabbing python-matplotlib's matplotlibrc file and using it to override the compiled version's RC file with, and lo: draw_event fires again. I'm not very familiar with MPL's internals so I'm sure there's a reason for this (one thing I immediately noticed was that the DEB RC file seems to use the TkAgg backend, whereas the compiled version uses the GTKAgg backend). However, it feels to me like whether or not a "user-mode" event fires or not should not depend on some configuration settings. I've yet to figure out which setting exactly causes draw_event to fail, but I just wanted to let you guys know; might be a good idea to tweak the default settings so that draw_event behaves as expected. Cheers, Jeroen DR ------------------------------------------------------------------------------ Xperia(TM) PLAY It's a major breakthrough. An authentic gaming smartphone on the nation's most reliable network. And it wants your games. http://p.sf.net/sfu/verizon-sfdev _______________________________________________ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users