Visualizza più immagini in una figura correttamente in Matplotlib

  1. Usa Matplotlib add_subplot() nel ciclo for
  2. Definire una funzione in base alle sottotrame in Matplotlib

L’idea principale per visualizzare più immagini in una figura è scorrere l’lista degli assi per tracciare singole immagini. Usiamo il metodo imshow() per visualizzare singole immagini.

Usa Matplotlib add_subplot() nel ciclo for

L’approccio più semplice per visualizzare più immagini in una figura potrebbe essere visualizzare ogni immagine usando add_subplot() per avviare la sottotrama e il metodo imshow() per visualizzare un’immagine all’interno di un ciclo for.

Sintassi per il metodo add_subplot():

add_subplot(rows, rows, i)

dove rows e rows rappresentano il numero totale di righe e colonne nella figura composta e i rappresenta l’indice dell’immagine da visualizzare.

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

Produzione:

visualizzare più immagini in un approccio di figura simper

Possiamo aggiungere maggiore flessibilità nel codice precedente per tracciare più caratteristiche sugli assi selezionati e fornire accesso a ciascun asse delle sottotrame.

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

Produzione:

visualizzare più immagini in una figura semplice con flessibilità

Qui, axes consente l’accesso per manipolare ciascuna delle sottotrame.

In alternativa, possiamo anche fornire l’accesso a ciascuno dei sotto-grafici con [row_index][column_index], che è più utile quando abbiamo un array di più immagini.

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

Produzione:

accesso a ciascuno dei sotto-grafici con indice di riga indice di colonna

Definire una funzione in base alle sottotrame in Matplotlib

Possiamo definire una funzione basata sul comando sottotrame che crea un numero di assi nelle figure, in base al numero di righe e colonne, e quindi itera sulla lista degli assi per tracciare le immagini aggiungendo un titolo per ognuna di esse .

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)

Produzione:

visualizzare più immagini in una figura definendo una funzione