如何调整子图的高度和宽度以实现紧密配合?

时间:2018-07-12 23:29:22

标签: python matplotlib subplot

我有一个代码可以将图片分解为多个部分,我想将它们一起打印出来(它们之间有一个很小的空间),但是要保留相同的尺寸,以便仍然清晰可见整个图像。

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 个答案:

答案 0 :(得分:1)

子图的高度和宽度之比必须恰好是图中各个部分的行数和列数之比。

这可以通过使用的gridspec的height_ratioswidth_ratios参数来实现。

import matplotlib.pyplot as plt

img = plt.imread("https://i.stack.imgur.com/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