HOWTO · Matplotlib
Visualizza più immagini in una figura correttamente in Matplotlib
Visualizza più immagini in una figura Matplotlib con una griglia di assi, quindi personalizza i singoli pannelli.
In questa pagina
Per visualizzare più immagini in una figura, crea una figura Matplotlib con un asse per ciascuna immagine, quindi chiama imshow() sull’asse corrispondente. fig.add_subplot() ti permette di costruire la griglia in un ciclo; plt.subplots() è comodo quando vuoi gli assi come un array.
Usare add_subplot() di Matplotlib in un ciclo for
Passa il numero di righe, il numero di colonne e un indice di pannello a partire da uno a fig.add_subplot(rows, columns, index). Il ciclo seguente riempie una griglia 2 per 2 con quattro array distinti e assegna a ciascun pannello un titolo. Gli esempi non vengono eseguiti qui; le spiegazioni descrivono il codice e l’uso delle API mostrati.
Esegui questo esempio:
import numpy as np
import matplotlib.pyplot as plt
rows, cols = 2, 2
images = [np.full((8, 8), value) for value in (1, 2, 3, 4)]
fig = plt.figure(figsize=(6, 5))
for index, image in enumerate(images, start=1):
ax = fig.add_subplot(rows, cols, index)
ax.imshow(image, cmap="viridis")
ax.set_title(f"Image {index}")
fig.tight_layout()
plt.show()
Ciascuna iterazione crea un asse e vi visualizza l’immagine di quell’iterazione. Conserva gli assi restituiti quando vuoi personalizzare i singoli pannelli in seguito. Per una griglia regolare, plt.subplots() restituisce gli assi in forma di riga e colonna; appiattiscili per l’iterazione e usa due indici per selezionare un pannello particolare.
import numpy as np
import matplotlib.pyplot as plt
rows, cols = 2, 2
images = [np.full((8, 8), value) for value in (1, 2, 3, 4)]
x = np.linspace(0, 7, 8)
fig, axes = plt.subplots(rows, cols, figsize=(6, 5))
for index, (ax, image) in enumerate(zip(axes.flat, images), start=1):
ax.imshow(image, cmap="viridis", alpha=0.75)
ax.set_title(f"Image {index}")
axes[0, 1].plot(x, x, color="white")
axes[1, 1].plot(x, 7 - x, color="red")
fig.tight_layout()
plt.show()
Qui axes.flat fornisce un modo semplice per visitare ciascun pannello, mentre axes[row, column] indirizza un pannello specifico. Le linee aggiuntive vengono disegnate sopra le immagini di quei pannelli. Assicurati che la griglia abbia abbastanza assi per ogni immagine; zip() si ferma quando uno degli input si esaurisce, quindi immagini o assi senza corrispondenza non vengono visualizzati da quel ciclo.
Definire una funzione basata sui subplot in Matplotlib
Per un uso ripetuto, racchiudi la configurazione della griglia in una funzione. Questa versione converte gli assi in un array piatto in modo da gestire anche una griglia 1 per 1, controlla che la griglia abbia spazio per ogni immagine, intitola ciascun pannello e nasconde gli assi per una figura incentrata sulle immagini.
import numpy as np
import matplotlib.pyplot as plt
def display_multiple_img(images, rows=1, cols=1):
images = list(images.items())
figure, axes = plt.subplots(nrows=rows, ncols=cols)
axes = np.atleast_1d(axes).ravel()
if len(images) > len(axes):
raise ValueError("The grid must have at least one axis per image.")
for ax, (title, image) in zip(axes, images):
ax.imshow(image, cmap="viridis")
ax.set_title(title)
ax.set_axis_off()
for ax in axes[len(images):]:
ax.set_axis_off()
figure.tight_layout()
plt.show()
images = {
"Image 1": np.full((8, 8), 1),
"Image 2": np.full((8, 8), 2),
"Image 3": np.full((8, 8), 3),
"Image 4": np.full((8, 8), 4),
}
display_multiple_img(images, rows=2, cols=2)
Passa una mappatura ordinata per inserimento dai titoli agli array di immagini, insieme alle dimensioni desiderate della griglia. La funzione trasforma gli assi in una sequenza piatta prima dell’iterazione, in modo che un singolo pannello funzioni altrettanto bene di una griglia a più pannelli. Se ci sono più immagini degli assi disponibili, solleva un ValueError; aumenta rows o cols per visualizzarle tutte.