HOWTO · Matplotlib

Comment afficher correctement plusieurs images dans une figure dans Matplotlib

Affichez plusieurs images dans une figure Matplotlib avec une grille d'axes, puis personnalisez les panneaux individuels.

Sur cette page

Pour afficher plusieurs images dans une figure, créez une figure Matplotlib avec un axe pour chaque image, puis appelez imshow() sur l’axe correspondant. fig.add_subplot() vous permet de construire la grille dans une boucle ; plt.subplots() est pratique lorsque vous voulez les axes sous forme de tableau.

Utiliser add_subplot() de Matplotlib dans une boucle for

Passez le nombre de lignes, le nombre de colonnes et un index de panneau commençant à un à fig.add_subplot(rows, columns, index). La boucle ci-dessous remplit une grille de 2 par 2 avec quatre tableaux distincts et donne un titre à chaque panneau. Les exemples ne sont pas exécutés ici ; les explications décrivent le code et l’utilisation de l’API présentés.

Exécutez cet exemple :

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

Chaque itération crée un axe et y affiche l’image de cette itération. Conservez les axes renvoyés lorsque vous souhaitez personnaliser des panneaux individuels plus tard. Pour une grille régulière, plt.subplots() renvoie les axes sous forme de lignes et de colonnes ; aplatissez-les pour l’itération et utilisez deux index pour sélectionner un panneau particulier.

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

Ici, axes.flat fournit un moyen simple de visiter chaque panneau, tandis que axes[row, column] désigne un panneau spécifique. Les lignes supplémentaires sont dessinées par-dessus les images de ces panneaux. Assurez-vous que la grille comporte suffisamment d’axes pour chaque image ; zip() s’arrête lorsque l’une des entrées est épuisée, de sorte que les images ou les axes sans correspondance ne sont pas affichés par cette boucle.

Définir une fonction basée sur les subplots dans Matplotlib

Pour un usage répété, regroupez la configuration de la grille dans une fonction. Cette version convertit les axes en un tableau plat afin de gérer également une grille de 1 par 1, vérifie que la grille a de la place pour chaque image, titre chaque panneau et masque les axes pour une figure centrée sur les images.

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)

Passez un mapping ordonné par insertion des titres vers les tableaux d’images, ainsi que les dimensions de grille souhaitées. La fonction transforme les axes en une séquence plate avant l’itération, de sorte qu’un seul panneau fonctionne aussi bien qu’une grille à plusieurs panneaux. S’il y a plus d’images que d’axes disponibles, elle lève une ValueError ; augmentez rows ou cols pour toutes les afficher.