|
From: <bh...@de...> - 2007-02-05 22:46:41
|
"John Hunter" <jd...@gm...> writes: > On 2/5/07, Berthold H=C3=B6llmann <bhoel-lDxpuoTbsqf2eFz/2M...@pu...= ane.org> 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 =3D Figure((3,7)) # set the width and height in inches > canvas =3D FigureCanvas(fig) > ax =3D fig.add_subplot(111) > ax.plot([.5,.7],[1.5, 2.5]) > ax.add_artist(Rectangle((.5, 1.5), .2, 1, fill=3DFalse)) > ax.set_aspect("equal") > canvas.print_figure('test.eps') 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 ----- ax.set_aspect("equal") ax.autoscale_view() w, h =3D fig.get_size_inches() xmin, xmax =3D ax.get_xlim() ymin, ymax =3D ax.get_ylim() xext =3D xmax - xmin yext =3D ymax - ymin if xext < yext: w =3D h * xext/yext else: h =3D 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. Thanks Berthold --=20 ber...@xn... / <http://h=C3=B6llmanns.de/> bh...@we... / <http://starship.python.net/crew/bhoel/> |