TL; DR . Используйте plt.subplots(nrows=nr, ncols=nc, figsize=(..., ...))
для настройки размера фигуры, чтобы отдельный субплот имел, по крайней мере приблизительно, одинаковое соотношение сторон изображений, которые должны быть показаны.
Ключевым моментом является то, что imshow
будет использовать квадратные пиксели, поэтому если ваше изображение имеет соотношение сторон 1: 2, изображения на графике будут иметь соотношение сторон 1: 2, и каждое из них будет стоять в середине свой собственный субплот - если соотношение сторон субплота отличается от соотношения сторон изображения, вы будете испытывать «синдром большой белой границы».
Давайте начнем с импорта и поддельного изображения с 1 : 2 аспектное соотношение
In [1]: import numpy as np
...: import matplotlib.pyplot as plt
In [2]: img = np.arange(54*108).reshape(108,54)
и скопируйте ваше расположение, в котором вы подразделили фигуру 8x6 (x: y) на 4x5 (x: y) субплотов - у вас есть субплоты, которые имеют горизонтальную ширину (8/4 = 2) и вертикально коротким (6/5 = 1,2), и каждое изображение, если оно центрировано на своем участке, имеет ШИРОКОЕ горизонтальное поле.
In [3]: f, axs = plt.subplots(5, 4)
...: for x in axs.flatten():
...: x.imshow(img) ; x.axis('off')
Теперь вернемся к роли строк и столбцов, теперь ваши графические объекты меньше по горизонтали (8/5 = 1,6) и выше (6/4 = 1,5), размещение изображений определенно лучше благодаря уменьшению горизонтальных полей белого цвета и увеличению размера изображения, поскольку доступная высота больше
In [4]: f, axs = plt.subplots(4, 5)
...: for x in axs.flatten():
...: x.imshow(img) ; x.axis('off')
Чтобы закончить историю, главное, чтобы сюжеты имели (как минимум приблизительно) такое же соотношение сторон, как и у изображений, которые вы используете, и с этой целью нам нужно вмешаться в параметр figsize
, назначив width: height, равное (ncols × 1) :( nrows × 2), в моем примере ниже figsize=(5,8)
In [5]: f, axs = plt.subplots(4, 5, figsize=(5,8))
...: for x in axs.flatten():
...: x.imshow(img) ; x.axis('off')