scipy: savefig without frames, axes, only content scipy: savefig without frames, axes, only content numpy numpy

scipy: savefig without frames, axes, only content


EDIT

Changed aspect='normal to aspect='auto' since that changed in more recent versions of matplotlib (thanks to @Luke19).


Assuming :

import matplotlib.pyplot as plt

To make a figure without the frame :

fig = plt.figure(frameon=False)fig.set_size_inches(w,h)

To make the content fill the whole figure

ax = plt.Axes(fig, [0., 0., 1., 1.])ax.set_axis_off()fig.add_axes(ax)

Then draw your image on it :

ax.imshow(your_image, aspect='auto')fig.savefig(fname, dpi)

The aspect parameter changes the pixel size to make sure they fill the figure size specified in fig.set_size_inches(…). To get a feel of how to play with this sort of things, read through matplotlib's documentation, particularly on the subject of Axes, Axis and Artist.


An easier solution seems to be:

fig.savefig('out.png', bbox_inches='tight', pad_inches=0)


You can find the bbox of the image inside the axis (using get_window_extent), and use the bbox_inches parameter to save only that portion of the image:

import numpy as npimport matplotlib.pyplot as pltdata=np.arange(9).reshape((3,3))fig=plt.figure()ax=fig.add_subplot(1,1,1)plt.axis('off')plt.imshow(data)extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())plt.savefig('/tmp/test.png', bbox_inches=extent)

I learned this trick from Joe Kington here.