64

Is there a way to automatically resize a figure to properly fit contained plots in a matplotlib/pylab image?

I'm creating heatmap (sub)plots that differ in aspect ratio according to the data used.

I realise I could calculate the aspect ratio and manually set it, but surely there's an easier way?

pufferfish
  • 16,651
  • 15
  • 56
  • 65

6 Answers6

74

Use bbox_inches='tight'

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

X = 10*np.random.rand(5,3)

fig = plt.figure(figsize=(15,5),facecolor='w') 
ax = fig.add_subplot(111)
ax.imshow(X, cmap=cm.jet)

plt.savefig("image.png",bbox_inches='tight',dpi=100)

...only works when saving images though, not showing them.

pufferfish
  • 16,651
  • 15
  • 56
  • 65
21

Another way of doing this is using the matplotlib tight_layout function

import matplotlib.pyplot as plt
fig,(ax) = plt.subplots(figsize=(8,4), ncols=1)
data = [0,1,2,3,4]
ax.plot(data)
fig.tight_layout()
fig.show()
Simon Hobbs
  • 990
  • 7
  • 11
18

just use aspect='auto' when you call imshow

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

X = 10*np.random.rand(5,3)
plt.imshow(X, aspect='auto')

it works even if it is just for showing and not saving

Homero Esmeraldo
  • 1,864
  • 2
  • 18
  • 34
5

you can try using axis('scaled')

import matplotlib.pyplot as plt
import numpy

#some dummy images
img1 = numpy.array([[.1,.2],[.3,.4]]) 
img2 = numpy.array([[.1,.2],[.3,.4]])

fig,ax = plt.subplots()
ax.imshow(img1,extent=[0,1,0,1])
ax.imshow(img2,extent=[2,3,0,1])
ax.axis('scaled') #this line fits your images to screen 
plt.show()
jelde015
  • 554
  • 6
  • 7
4

Do you mean changing the size of the image or the area that is visable within a plot?

The size of a figure can be set with Figure.set_figsize_inches. Also the SciPy Cookbook has an entry on changing image size which contains a section about multiple images per figure.

Also take a look at this question.

Community
  • 1
  • 1
wierob
  • 4,299
  • 1
  • 26
  • 27
  • I mean the dimensions of the Figure object. i.e. Crop the figure to fit the contained plot(s). One would probably have to provide either a width or a height first, and have the other calculated. – pufferfish Aug 13 '09 at 10:35
  • I think the correct command is ``.set_size_inches`` without the ``fig`` – innisfree Nov 17 '13 at 22:20
2

Also possible to use ax.autoscale with ax object

ax.autoscale(enable=True) 
Andrew D.
  • 1,022
  • 12
  • 26
Shakujin
  • 64
  • 8