Wie man in Matplotlib mehrere Bilder in einer Abbildung korrekt anzeigt

Suraj Joshi 25 Juni 2020
  1. Verwendung von add_subplot() in for-Schleife
  2. Definieren Sie eine Funktion die auf den Teilplots basiert
Wie man in Matplotlib mehrere Bilder in einer Abbildung korrekt anzeigt

Die Kernidee für die Anzeige mehrerer Bilder in einer Abbildung besteht darin, über die Liste der Achsen zu iterieren, um einzelne Bilder zu plotten. Wir verwenden die imshow() Methode, um einzelne Bilder anzuzeigen.

Verwendung von add_subplot() in for-Schleife

Der einfachste Ansatz zur Anzeige mehrerer Bilder in einer Abbildung könnte darin bestehen, jedes Bild mit Hilfe der Methode add_subplot() anzuzeigen, um Subplot zu initiieren, und der Methode imshow(), um ein Bild innerhalb einer for-Schleife anzuzeigen.

Syntax für die Methode add_subplot():

add_subplot(rows, columns, i)

rows und columns die Gesamtzahl der Zeilen und Spalten in der zusammengesetzten Abbildung darstellen und i den Index des anzuzeigenden Bildes darstellt.

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

Ausgabe:

Anzeige mehrerer Bilder in einem Figure-Simper-Ansatz

Wir können den obigen Code flexibler gestalten, um mehr Merkmale auf ausgewählten Achsen zu plotten und Zugang zu jeder Achse von Unterplots zu ermöglichen.

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

Ausgabe:

Anzeige mehrerer Bilder in einem Figurensimpler mit Flexibilität

Hier ermöglicht axes den Zugang zur Manipulation jeder einzelnen Teilhandlung.

Alternativ können wir auch mit [row_index][column_index] Zugang zu jedem der Subplots bieten, was hilfreicher ist, wenn wir ein Array aus mehreren Bildern haben.

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

Ausgabe:

Zugriff auf jede der Unterdarstellungen mit Zeilenindex-Spaltenindex

Definieren Sie eine Funktion die auf den Teilplots basiert

Wir können eine Funktion definieren, die auf dem Befehl subplots basiert, die eine Anzahl von Achsen in den Abbildungen entsprechend der Anzahl der Zeilen und Spalten erzeugt und dann über die Liste der Achsen iteriert, um Bilder zu zeichnen, wobei für jede von ihnen ein Titel hinzugefügt wird.

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)

Ausgabe:

Anzeige mehrerer Bilder in einer Abbildung durch Definition einer Funktion

Suraj Joshi avatar Suraj Joshi avatar

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

LinkedIn