Agg eps and bounding box / OO problems

"John Hunter" <jdh2358@...287...> writes:


On 2/5/07, Berthold Höllmann <bhoel-lDxpuoTbsqf2eFz/2MeuCQ@...1456....> wrote:

I get a file 'test.eps'. Using matplotlib 0.87.7 the PS bounding box
of the generated plot is far to wide. Is this a problem with my script
or a Problem of FigureCanvasAgg (and FigureCanvasPS)? What can I do to
get a tight bounding box?

This is a problem with the way PS computes the bounding box -- it uses
the bounding box of the Figure and ignores the fact that much of your
figure is whitespace. It should compute the bounding box of the
visible figure elements, so this should be considered a bug. To
workaround, you can set the figure size to be more like the size of
the content

  fig = Figure((3,7)) # set the width and height in inches
  canvas = FigureCanvas(fig)
  ax = fig.add_subplot(111)
  ax.plot([.5,.7],[1.5, 2.5])
  ax.add_artist(Rectangle((.5, 1.5), .2, 1, fill=False))

So there is no way to calculate the size occupied by the visible
figure elements? In my target application I also have no easy way to
figure out the size of the resulting plot, I hoped matplotlib has a
way tp extract it from the plotted data.

something like

w, h = fig.get_size_inches()
xmin, xmax = ax.get_xlim()
ymin, ymax = ax.get_ylim()
xext = xmax - xmin
yext = ymax - ymin
if xext < yext:
    w = h * xext/yext
    h = w * yext/xext

gives a tighter bounding box, still having somehow too much room in
the unchanged direction.

Further, when I leave out the "ax.plot" line, the generated figure is
missing the "Rectangle" and is showing only a pair of axes counting
from 0 to 1. Is that a bug of matplotlib or something I have to fix in
my script?

Use add_patch instead of add_artist. add_artist is the most generic
method and Axes doesn't know how to query it's argument for it's data
limits, which it then feeds to the autoscaler. If you use add_line to
add lines.Line2D and add_patch to add patches.Patch instances, then
Axes will know how to introspect them and update the autoscaler. But
you will need to explicitly call "autoscale_view" before saving.
Something like

I had tried "add_patch" but missed the ax.autoscale_view() call.

berthold@...1453... / <http://hö>
bhoel@...273... / <;