Como exibir várias imagens em uma figura Corretamente em Matplotlib

  1. Utilize Matplotlib add_subplot() em for Loop
  2. Definir uma função com base nos subquadros em Matplotlib

A idéia central para exibir múltiplas imagens em uma figura é iterar sobre a lista de eixos para traçar imagens individuais. Utilizamos o método imshow() para exibir imagens individuais.

Utilize Matplotlib add_subplot() em for Loop

A abordagem mais simples para exibir múltiplas imagens em uma figura pode ser exibir cada imagem utilizando add_subplot() para iniciar o subplot e imshow() método para exibir uma imagem dentro de um loop for.

Sintaxe para o método add_subplot():

add_subplot(rows, columns, i)

onde rows e columns representam o número total de linhas e colunas em figura composta e i representa o índice da imagem a ser exibida.

import numpy as np
import matplotlib.pyplot as plt

width=5
height=5
rows = 2
cols = 2
axes=[]
fig=plt.figure()

for a in range(rows*cols):
    b = np.random.randint(7, size=(height,width))
    axes.append( fig.add_subplot(rows, cols, a+1) )
    subplot_title=("Subplot"+str(a))
    axes[-1].set_title(subplot_title)  
    plt.imshow(b)
fig.tight_layout()    
plt.show()

Resultado:

exibir múltiplas imagens em uma aproximação de figura simpática

Podemos acrescentar mais flexibilidade no código acima para traçar mais características em eixos selecionados e fornecer acesso a cada eixo de subquadros.

import numpy as np
import matplotlib.pyplot as plt

width=5
height=5
rows = 2
cols = 2
fig=plt.figure()

x=np.linspace(-3,3,100)
y1=np.sin(x)
y2=1/(1+np.exp(-x))

axes = []

for i in range(cols*rows):
    b = np.random.randint(10, size=(height,width))
    axes.append( fig.add_subplot(rows, cols, i+1) )
    subplot_title=("Subplot"+str(i))
    axes[-1].set_title(subplot_title)  
    plt.imshow(b)

axes[1].plot(x, y1)
axes[3].plot(x,y2)
fig.tight_layout()

plt.show()

Resultado:

exibir múltiplas imagens em uma figura, simultâneamente com flexibilidade

Aqui, os axes permitem o acesso para manipular cada uma das subquadrantes.

Alternativamente, também podemos fornecer acesso a cada um dos subquadros com [row_index][column_index], o que é mais útil quando temos uma série de imagens múltiplas.

import numpy as np
import matplotlib.pyplot as plt

width=5
height=5
rows = 2
cols = 2

x=np.linspace(0,3,100)
y1=np.sin(x)
y2=1/(1+np.exp(-x))
         
figure, axes = plt.subplots(nrows=rows, ncols=cols)

for a, b in enumerate(axes.flat):
    image = np.random.randint(7, size=(height,width))
    b.imshow(image, alpha=0.25)
    r = a // cols
    c = a % cols
    subtitle="Row:"+str(r)+", Col:"+str(c)
    b.set_title(subtitle)

axes[0][1].plot(x, y1)
axes[1][1].plot(x,y2)

figure.tight_layout()
plt.show()

Resultado:

acesso a cada um dos subquadrantes com índice de coluna de índice de linha

Definir uma função com base nos subquadros em Matplotlib

Podemos definir uma função baseada no comando subplots que cria um número de eixos nas figuras, de acordo com o número de linhas e colunas, e em seguida iteratiza sobre a lista dos eixos para traçar imagens adicionando um título para cada uma delas.

import numpy as np
import matplotlib.pyplot as plt

def display_multiple_img(images, rows = 1, cols=1):
    figure, ax = plt.subplots(nrows=rows,ncols=cols )
    for ind,title in enumerate(images):
        ax.ravel()[ind].imshow(images[title])
        ax.ravel()[ind].set_title(title)
        ax.ravel()[ind].set_axis_off()
    plt.tight_layout()
    plt.show()

total_images = 4
images = {'Image'+str(i): np.random.rand(100, 100) for i in range(total_images)}

display_multiple_img(images, 2, 2)

Resultado:

exibir múltiplas imagens em uma figura definindo uma função