Mehrere Bilder mit einer einzigen Farbleiste#

Verwenden Sie eine einzige Farbleiste für mehrere Bilder.

Derzeit kann eine Farbleiste nur mit einem einzigen Bild verbunden werden. Die Verbindung garantiert, dass die Datenfärbung mit der Skala der Colormap übereinstimmt (d.h. die Farbe des Wertes x in der Colormap wird zur Färbung eines Datenwertes x im Bild verwendet).

Wenn wir möchten, dass eine Farbleiste für mehrere Bilder repräsentativ ist, müssen wir konsistente Datenfärbung explizit sicherstellen, indem wir die gleiche Daten-Normalisierung für alle Bilder verwenden. Dies stellen wir sicher, indem wir explizit ein norm Objekt erstellen, das wir an alle Bild-Plotting-Methoden übergeben.

import matplotlib.pyplot as plt
import numpy as np

from matplotlib import colors

np.random.seed(19680801)

datasets = [
    (i+1)/10 * np.random.rand(10, 20)
    for i in range(4)
]

fig, axs = plt.subplots(2, 2)
fig.suptitle('Multiple images')

# create a single norm to be shared across all images
norm = colors.Normalize(vmin=np.min(datasets), vmax=np.max(datasets))

images = []
for ax, data in zip(axs.flat, datasets):
    images.append(ax.imshow(data, norm=norm))

fig.colorbar(images[0], ax=axs, orientation='horizontal', fraction=.1)

plt.show()
Multiple images

Die Farben bleiben nun über alle Bilder hinweg konsistent, wenn die Skalierung geändert wird, z.B. durch Zoomen in der Farbleiste oder über die GUI "Achsen, Kurven und Bildparameter bearbeiten" des Qt-Backends. Dies ist für die meisten praktischen Anwendungsfälle ausreichend.

Erweitert: Zusätzlich die Colormap synchronisieren#

Das Teilen eines gemeinsamen Norm-Objekts garantiert eine synchronisierte Skalierung, da Skalierungsänderungen das Norm-Objekt direkt ändern und sich somit auf alle Bilder auswirken, die diese Norm verwenden. Dieser Ansatz hilft nicht bei der Synchronisierung von Colormaps, da das Ändern der Colormap eines Bildes (z.B. über die GUI "Achsen, Kurven und Bildparameter bearbeiten" des Qt-Backends) dazu führt, dass das Bild auf das neue Colormap-Objekt verweist. Daher werden die anderen Bilder nicht aktualisiert.

Um die anderen Bilder zu aktualisieren, synchronisieren Sie die Colormaps mit dem folgenden Code

def sync_cmaps(changed_image):
    for im in images:
        if changed_image.get_cmap() != im.get_cmap():
            im.set_cmap(changed_image.get_cmap())

for im in images:
    im.callbacks.connect('changed', sync_cmaps)

Gesamtlaufzeit des Skripts: (0 Minuten 1,012 Sekunden)

Galerie generiert von Sphinx-Gallery