Comment afficher correctement plusieurs images dans une figure dans Matplotlib

Suraj Joshi 30 janvier 2023
  1. Utilisez Matplotlib add_subplot() dans la boucle for
  2. Définir une fonction basée sur les sous-parcelles dans Matplotlib
Comment afficher correctement plusieurs images dans une figure dans Matplotlib

L’idée de base pour afficher plusieurs images dans une figure est d’itérer sur la liste des axes pour tracer des images individuelles. Nous utilisons la méthode imshow() pour afficher des images individuelles.

Utilisez Matplotlib add_subplot() dans la boucle for

L’approche la plus simple pour afficher plusieurs images dans une figure peut être d’afficher chaque image en utilisant add_subplot() pour lancer le sous-tracé et la méthode imshow() pour afficher une image à l’intérieur d’une boucle for.

Syntaxe de la méthode add_subplot():

add_subplot(rows, columns, i)

rows et columns représentent le nombre total de lignes et de colonnes dans la figure composite et i représente l’index de l’image à afficher.

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

Production:

afficher plusieurs images dans une approche simper figure

Nous pouvons ajouter plus de flexibilité dans le code ci-dessus pour tracer plus d’entités sur les axes sélectionnés et donner accès à chacun des axes des sous-tracés.

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

Production:

afficher plusieurs images dans un simper de figure avec flexibilité

Ici, axes permet d’accéder à manipuler chacune des sous-parcelles.

Alternativement, nous pouvons également fournir un accès à chacun des sous-tracés avec [row_index][column_index], ce qui est plus utile lorsque nous avons un tableau de plusieurs images.

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

Production:

accès à chacun des sous-tracés avec index des colonnes index des colonnes

Définir une fonction basée sur les sous-parcelles dans Matplotlib

Nous pouvons définir une fonction basée sur la commande subplots qui crée un certain nombre d’axes dans les figures, en fonction du nombre de lignes et de colonnes, puis parcourt la liste des axes pour tracer des images en ajoutant un titre pour chacune d’entre elles.

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)

Production:

afficher plusieurs images dans une figure en définissant une fonction

Auteur: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn