Как увеличить изображение внутри pyplot.subplots? - PullRequest
1 голос
/ 21 января 2020

Мне нужно отобразить 20 изображений в сетке, и мой код выглядит следующим образом

def plot_matric_demo(img, nrows, ncols):
    fig, ax = plt.subplots(nrows=nrows, ncols=ncols)
    cur_index = 0
    for row in ax:
        for col in row:
            col.imshow(img)
            cur_index = cur_index + 1
            col.axis('off')

    plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0)
    plt.show()

subplot_img = cv2.imread("subplots.png")
plot_matric_demo(subplot_img, 5, 4)

Кажется, что изображения на вспомогательных участках были слишком маленькими, в то время как расстояние было большим, мне было интересно, как я мог сделать изображения на участках больше?

enter image description here

1 Ответ

3 голосов
/ 21 января 2020

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')                                                 

enter image description here

Теперь вернемся к роли строк и столбцов, теперь ваши графические объекты меньше по горизонтали (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')                                                 

enter image description here

Чтобы закончить историю, главное, чтобы сюжеты имели (как минимум приблизительно) такое же соотношение сторон, как и у изображений, которые вы используете, и с этой целью нам нужно вмешаться в параметр 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')                                                 

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...