Viele Möglichkeiten, Bilder zu plotten#

Die gebräuchlichste Methode, Bilder in Matplotlib zu plotten, ist mit imshow. Die folgenden Beispiele demonstrieren einen Großteil der Funktionalität von imshow und die vielen Bilder, die Sie erstellen können.

import matplotlib.pyplot as plt
import numpy as np

import matplotlib.cbook as cbook
import matplotlib.cm as cm
from matplotlib.patches import PathPatch
from matplotlib.path import Path

# Fixing random state for reproducibility
np.random.seed(19680801)

Zuerst generieren wir eine einfache bivariate Normalverteilung.

delta = 0.025
x = y = np.arange(-3.0, 3.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
Z = (Z1 - Z2) * 2

fig, ax = plt.subplots()
im = ax.imshow(Z, interpolation='bilinear', cmap=cm.RdYlGn,
               origin='lower', extent=[-3, 3, -3, 3],
               vmax=abs(Z).max(), vmin=-abs(Z).max())

plt.show()
image demo

Es ist auch möglich, Bilder von Fotos anzuzeigen.

# A sample image
with cbook.get_sample_data('grace_hopper.jpg') as image_file:
    image = plt.imread(image_file)

# And another image, using 256x256 16-bit integers.
w, h = 256, 256
with cbook.get_sample_data('s1045.ima.gz') as datafile:
    s = datafile.read()
A = np.frombuffer(s, np.uint16).astype(float).reshape((w, h))
extent = (0, 25, 0, 25)

fig, ax = plt.subplot_mosaic([
    ['hopper', 'mri']
], figsize=(7, 3.5))

ax['hopper'].imshow(image)
ax['hopper'].axis('off')  # clear x-axis and y-axis

im = ax['mri'].imshow(A, cmap=plt.cm.hot, origin='upper', extent=extent)

markers = [(15.9, 14.5), (16.8, 15)]
x, y = zip(*markers)
ax['mri'].plot(x, y, 'o')

ax['mri'].set_title('MRI')

plt.show()
MRI

Interpolieren von Bildern#

Es ist auch möglich, Bilder vor der Anzeige zu interpolieren. Seien Sie vorsichtig, da dies die Darstellung Ihrer Daten manipulieren kann, aber es kann hilfreich sein, um das gewünschte Aussehen zu erzielen. Unten zeigen wir dasselbe (kleine) Array, interpoliert mit drei verschiedenen Interpolationsmethoden.

Die Mitte des Pixels bei A[i, j] wird bei (i+0,5, i+0,5) geplottet. Wenn Sie interpolation='nearest' verwenden, hat die Region, die von (i, j) und (i+1, j+1) begrenzt wird, die gleiche Farbe. Wenn Sie interpolation verwenden, hat die Pixelmitte die gleiche Farbe wie bei nearest, aber andere Pixel werden zwischen den benachbarten Pixeln interpoliert.

Um Randeffekte bei der Interpolation zu vermeiden, füllt Matplotlib das Eingabearray mit identischen Pixeln am Rand auf: Wenn Sie ein 5x5-Array mit den Farben a-y wie unten haben

a b c d e
f g h i j
k l m n o
p q r s t
u v w x y

Matplotlib berechnet die Interpolation und Größenänderung auf dem aufgefüllten Array

a a b c d e e
a a b c d e e
f f g h i j j
k k l m n o o
p p q r s t t
o u v w x y y
o u v w x y y

und extrahiert dann den zentralen Bereich des Ergebnisses. (Extrem alte Versionen von Matplotlib (<0.63) füllten das Array nicht auf, sondern passten die Ansichtsgrenzen an, um die betroffenen Randbereiche zu verbergen.)

Dieser Ansatz ermöglicht das Plotten des vollen Umfangs eines Arrays ohne Randeffekte und beispielsweise das Übereinanderlegen mehrerer Bilder unterschiedlicher Größe mit unterschiedlichen Interpolationsmethoden – siehe Bilder mit Alpha-Blending überlagern. Dies impliziert auch einen Leistungseinbruch, da dieses neue temporäre, aufgefüllte Array erstellt werden muss. Anspruchsvolle Interpolation bedeutet ebenfalls einen Leistungseinbruch; für maximale Leistung oder sehr große Bilder wird interpolation='nearest' empfohlen.

A = np.random.rand(5, 5)

fig, axs = plt.subplots(1, 3, figsize=(10, 3))
for ax, interp in zip(axs, ['nearest', 'bilinear', 'bicubic']):
    ax.imshow(A, interpolation=interp)
    ax.set_title(interp.capitalize())
    ax.grid(True)

plt.show()
Nearest, Bilinear, Bicubic

Sie können angeben, ob Bilder mit dem Array-Ursprung x[0, 0] in der oberen linken oder unteren rechten Ecke geplottet werden sollen, indem Sie den Parameter origin verwenden. Sie können auch die Standardeinstellung image.origin in Ihrer matplotlibrc-Datei steuern. Weitere Informationen zu diesem Thema finden Sie im vollständigen Leitfaden zu Ursprung und Ausdehnung.

x = np.arange(120).reshape((10, 12))

interp = 'bilinear'
fig, axs = plt.subplots(nrows=2, sharex=True, figsize=(3, 5))
axs[0].set_title('blue should be up')
axs[0].imshow(x, origin='upper', interpolation=interp)

axs[1].set_title('blue should be down')
axs[1].imshow(x, origin='lower', interpolation=interp)
plt.show()
blue should be up, blue should be down

Schließlich zeigen wir ein Bild unter Verwendung eines Ausschnittpfads.

delta = 0.025
x = y = np.arange(-3.0, 3.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
Z = (Z1 - Z2) * 2

path = Path([[0, 1], [1, 0], [0, -1], [-1, 0], [0, 1]])
patch = PathPatch(path, facecolor='none')

fig, ax = plt.subplots()
ax.add_patch(patch)

im = ax.imshow(Z, interpolation='bilinear', cmap=cm.gray,
               origin='lower', extent=[-3, 3, -3, 3],
               clip_path=patch, clip_on=True)
im.set_clip_path(patch)

plt.show()
image demo

Referenzen

Die Verwendung der folgenden Funktionen, Methoden, Klassen und Module wird in diesem Beispiel gezeigt

Gesamtlaufzeit des Skripts: (0 Minuten 4,868 Sekunden)

Galerie generiert von Sphinx-Gallery