HOWTO · Matplotlib

Wie man in Matplotlib mehrere Bilder in einer Abbildung korrekt anzeigt

Zeigen Sie mehrere Bilder in einer Matplotlib-Abbildung mit einem Raster von Achsen an und passen Sie dann einzelne Panels an.

Auf dieser Seite

Um mehrere Bilder in einer Abbildung anzuzeigen, erstellen Sie eine Matplotlib-Abbildung mit einer Achse für jedes Bild und rufen Sie dann imshow() auf der entsprechenden Achse auf. Mit fig.add_subplot() können Sie das Raster in einer Schleife aufbauen; plt.subplots() ist praktisch, wenn Sie die Achsen als Array haben möchten.

Matplotlib add_subplot() in einer for-Schleife verwenden

Übergeben Sie die Anzahl der Zeilen, die Anzahl der Spalten und einen einbasierten Panel-Index an fig.add_subplot(rows, columns, index). Die folgende Schleife füllt ein 2-mal-2-Raster mit vier verschiedenen Arrays und gibt jedem Panel einen Titel. Die Beispiele werden hier nicht ausgeführt; die Erläuterungen beschreiben den gezeigten Code und die API-Verwendung.

Führen Sie dieses Beispiel aus:

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

Jede Iteration erstellt eine Achse und zeigt das Bild dieser Iteration darauf an. Behalten Sie die zurückgegebenen Achsen, wenn Sie einzelne Panels später anpassen möchten. Für ein regelmäßiges Raster gibt plt.subplots() die Achsen in Zeilen- und Spaltenform zurück; flachen Sie sie für die Iteration ab und verwenden Sie zwei Indizes, um ein bestimmtes Panel auszuwählen.

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

Hier bietet axes.flat eine einfache Möglichkeit, jedes Panel zu besuchen, während axes[row, column] ein bestimmtes Panel adressiert. Die zusätzlichen Linien werden über die Bilder dieser Panels gezeichnet. Stellen Sie sicher, dass das Raster genügend Achsen für jedes Bild hat; zip() stoppt, wenn eine der Eingaben erschöpft ist, sodass nicht zugeordnete Bilder oder Achsen von dieser Schleife nicht angezeigt werden.

Eine Funktion auf Basis der Subplots in Matplotlib definieren

Für die wiederholte Verwendung verpacken Sie den Rasteraufbau in eine Funktion. Diese Version wandelt die Achsen in ein flaches Array um, sodass sie auch ein 1-mal-1-Raster behandelt, prüft, ob das Raster Platz für jedes Bild hat, betitelt jedes Panel und blendet die Achsen für eine bildfokussierte Abbildung aus.

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)

Übergeben Sie eine einfügungsgeordnete Zuordnung von Titeln zu Bild-Arrays sowie die gewünschten Rasterabmessungen. Die Funktion verwandelt die Achsen vor der Iteration in eine flache Folge, sodass ein einzelnes Panel genauso funktioniert wie ein Raster mit mehreren Panels. Wenn es mehr Bilder als verfügbare Achsen gibt, löst sie einen ValueError aus; erhöhen Sie rows oder cols, um alle anzuzeigen.