Reputation: 17415
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?
Upvotes: 67
Views: 183795
Reputation: 648
Use compressed layout - https://matplotlib.org/stable/users/explain/axes/constrainedlayout_guide.html#compressed-layout
fig, axs = plt.subplots(2, 2, layout='compressed')
It resizes the entire figure to remove redundant white space.
Upvotes: 0
Reputation: 74
Also possible to use ax.autoscale with ax object
ax.autoscale(enable=True)
Upvotes: 3
Reputation: 604
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()
Upvotes: 8
Reputation: 1010
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()
Upvotes: 21
Reputation: 2553
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
Upvotes: 18
Reputation: 17415
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.
Upvotes: 77
Reputation: 4359
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.
Upvotes: 4