1

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

1 Answer 1

1

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

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.