Choosing optimal figure width/height automatically

Benjamin Root writes:

I particularly like using the figaspect() function:

(...)

It isn't perfect, but for its simplicity, it gets it mostly right.

Thanks, Benjamin, for your quick reply.

Unfortunately, figaspect is only an approximate solution, as it simply
uses the aspect ration of the image for the whole figure (with axes and
labels).

I wonder how difficult it would be to teach matplotlib to tightly fit
the axes around an image, and, ideally, output the figure cropped.

<snip>

Unfortunately, figaspect is only an approximate solution, as it simply
uses the aspect ration of the image for the whole figure (with axes and
labels).

I wonder how difficult it would be to teach matplotlib to tightly fit
the axes around an image, and, ideally, output the figure cropped.

So, you're wanting the image to be displayed pixel-to-pixel, but still have
(tight) room for the axes, etc?

If so, you can use the "bbox_inches" kwarg to crop "out" and capture the
extent of the labels, etc, and just set the figure size to exactly the size
of the image.

For example:

import numpy as np
import matplotlib.pyplot as plt

dpi = 80
data = np.random.random((100, 100))

height, width = np.array(data.shape, dtype=float) / dpi

fig, ax = plt.subplots(figsize=(width, height), dpi=dpi)
ax.imshow(data, interpolation='none')
fig.savefig('test.png', bbox_inches='tight')

If show the figure (i.e. "plt.show()"), the ticklabels, etc will be outside
the figure and not shown, but they will be properly saved, regardless.

Hope that helps,
-Joe

···

------------------------------------------------------------------------------
October Webinars: Code for Performance
Free Intel webinars can help you accelerate application performance.
Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most
from
the latest Intel processors and coprocessors. See abstracts and register >
http://pubads.g.doubleclick.net/gampad/clk?id=60135031&iu=/4140/ostg.clktrk
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Would something like this suit your needs ?

import matplotlib.pyplot as plt

# Image size
width,height = 640,480

# Pixel border around image
border = 1

dpi = 72.0
figsize= (width+2*border)/float(dpi), (height+2*border)/float(dpi)
fig = plt.figure(figsize=figsize, dpi=dpi, facecolor="white")
hpixel = 1.0/(width+2*border)
vpixel = 1.0/(height+2*border)
ax = fig.add_axes([border*hpixel, border*vpixel,
                  1-2*border*hpixel, 1-2*border*vpixel])

ax.set_xlim(0, width)
ax.set_ylim(0, height)
plt.show()

Nicolas

···

On Oct 17, 2013, at 4:16 PM, Christoph Groth <christoph@...4460...> wrote:

Benjamin Root writes:

I particularly like using the figaspect() function:

(...)

It isn't perfect, but for its simplicity, it gets it mostly right.

Thanks, Benjamin, for your quick reply.

Unfortunately, figaspect is only an approximate solution, as it simply
uses the aspect ration of the image for the whole figure (with axes and
labels).

I wonder how difficult it would be to teach matplotlib to tightly fit
the axes around an image, and, ideally, output the figure cropped.

------------------------------------------------------------------------------
October Webinars: Code for Performance
Free Intel webinars can help you accelerate application performance.
Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from
the latest Intel processors and coprocessors. See abstracts and register >
http://pubads.g.doubleclick.net/gampad/clk?id=60135031&iu=/4140/ostg.clktrk
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users