bbox_inches='tight' issue with text outside axes

Hello,

I have run into a problem with the bbox_inches='tight' option which allows a tight bounding box to be computed for a plot. In the following example:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as mpl

fig = mpl.figure()
ax = fig.add_subplot(1,1,1)
ax.text(-0.2,0.5,'text',transform=ax.transAxes)
fig.savefig('test.png', bbox_inches='tight')

matplotlib produces a plot where the text label does not appear. This may be due to the bounding box algorithm not taking into account text written using Axes.text that could fall outside the Axes. One solution is to use set_xlabel and set_ylabel, for which the bounding box is correctly calculated, but in some cases it is desirable to plot labels outside the box using 'text' (for example if multiple labels are needed).

I have submitted a bug report here:

https://sourceforge.net/tracker/?func=detail&aid=3011032&group_id=80706&atid=560720

Cheers,

Tom

The currently implemented bounding box algorithm is very simple and it
basically only accounts the title, axis label and ticklabels etc. I
thought about implementing a general algorithm that accounts all the
visible artist, but I found it very difficult (at least for me) given
the support of the spline path and clipping. So, at the moment this is
beyond me and I have no plan to improve it. But any contribution will
be welcomed.

As a workaround, savefig can take bbox_extra_artists keyword (this may
only be in the svn version though), which is a list artist that needs
to be accounted for the bounding box calculation. So in your case, the
below code will work.

t1 = ax.text(-0.2,0.5,'text',transform=ax.transAxes)
fig.savefig('test.png', bbox_inches='tight', bbox_extra_artists=[t1])

Given that this will not be fixed in near future and a workaround
being suggested, I'm moving this to a feature request.

-JJ

ยทยทยท

On Thu, Jun 3, 2010 at 10:05 AM, Thomas Robitaille <thomas.robitaille@...287...> wrote:

Hello,

I have run into a problem with the bbox_inches='tight' option which allows a tight bounding box to be computed for a plot. In the following example:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as mpl

fig = mpl.figure()
ax = fig.add_subplot(1,1,1)
ax.text(-0.2,0.5,'text',transform=ax.transAxes)
fig.savefig('test.png', bbox_inches='tight')

matplotlib produces a plot where the text label does not appear. This may be due to the bounding box algorithm not taking into account text written using Axes.text that could fall outside the Axes. One solution is to use set_xlabel and set_ylabel, for which the bounding box is correctly calculated, but in some cases it is desirable to plot labels outside the box using 'text' (for example if multiple labels are needed).

I have submitted a bug report here:

https://sourceforge.net/tracker/?func=detail&aid=3011032&group_id=80706&atid=560720

Cheers,

Tom
------------------------------------------------------------------------------
ThinkGeek and WIRED's GeekDad team up for the Ultimate
GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the
lucky parental unit. See the prize list and enter to win:
http://p.sf.net/sfu/thinkgeek-promo
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
matplotlib-users List Signup and Options