Raksha
Raksha

Reputation: 1699

How to adjust subplots' height and width for tight fit?

I have a code to break up a picture into parts and I'd like to print them out together (with a small space between them), but retain the same sizes so the full image is still clearly visible.

def crop_image(img, quadrant):
    img = img_to_array(img)
    d = img.shape
    rows = int(d[0]*2/3)
    cols = int(d[1]*2/3)
    q = {"TL": img[:rows,:cols,:],
         "TR": img[:rows,cols:,:],
         "BL": img[rows:,:cols,:],
         "BR": img[rows:,cols:,:]}
    return array_to_img(q[quadrant])

img = load_img('./example1.jpeg', target_size=(224, 224))
cropped = crop_image(img, 'TR')
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2,2)
ax1.imshow(crop_image(img, 'TL'))
ax1.axis('off')
ax2.imshow(crop_image(img, 'TR'))
ax2.axis('off')
ax3.imshow(crop_image(img, 'BL'))
ax3.axis('off')
ax4.imshow(crop_image(img, 'BR'))
ax4.axis('off')
fig.subplots_adjust(hspace=0.1)
plt.tight_layout()

enter image description here

Upvotes: 1

Views: 430

Answers (1)

ImportanceOfBeingErnest
ImportanceOfBeingErnest

Reputation: 339230

The ratio between the subplot heights and width needs to be exactly the ratio between the number of rows and columns of the individual parts of the figure.

This can be accomplished via the height_ratios and width_ratios arguments of the gridspec in use.

import matplotlib.pyplot as plt

img = plt.imread("https://i.sstatic.net/9qe6z.png")
d = img.shape
rows = int(d[0]*2/3)
cols = int(d[1]*2/3)
q = {"TL": img[:rows,:cols,:],
     "TR": img[:rows,cols:,:],
     "BL": img[rows:,:cols,:],
     "BR": img[rows:,cols:,:]}

kw = dict(height_ratios=[rows, d[0]-rows], width_ratios=[cols, d[1]-cols])

fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2,2, gridspec_kw=kw)
ax1.imshow(q['TL'])
ax2.imshow(q['TR'])
ax3.imshow(q['BL'])
ax4.imshow(q['BR'])

for ax in (ax1, ax2, ax3, ax4):
    ax.axis("off")
fig.subplots_adjust(hspace=0.1)

plt.show()

enter image description here

Upvotes: 1

Related Questions