Notiz
Klicken Sie hier , um den vollständigen Beispielcode herunterzuladen
Bild-Demo #
Viele Möglichkeiten, Bilder in Matplotlib zu plotten.
Die gebräuchlichste Art, 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 numpy as np
import matplotlib.cm as cm
import matplotlib.pyplot as plt
import matplotlib.cbook as cbook
from matplotlib.path import Path
from matplotlib.patches import PathPatch
# 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()
Es ist auch möglich, Bilder von Bildern 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()
Bilder interpolieren #
Es ist auch möglich, Bilder zu interpolieren, bevor sie angezeigt werden. Seien Sie vorsichtig, da dies das Aussehen Ihrer Daten manipulieren kann, aber es kann hilfreich sein, um das gewünschte Aussehen zu erzielen. Unten zeigen wir das gleiche (kleine) Array, interpoliert mit drei verschiedenen Interpolationsmethoden.
Die Mitte des Pixels bei A[i, j] ist bei (i+0,5, i+0,5) aufgetragen. Wenn Sie interpolation='nearest' verwenden, hat der durch (i, j) und (i+1, j+1) begrenzte Bereich dieselbe Farbe. Wenn Sie die Interpolation verwenden, hat die Pixelmitte die gleiche Farbe wie die nächste, aber andere Pixel werden zwischen den benachbarten Pixeln interpoliert.
Um Kanteneffekte bei der Interpolation zu vermeiden, füllt Matplotlib das Eingabearray mit identischen Pixeln um den Rand herum auf: Wenn Sie ein 5x5-Array mit Farben wie unten haben:
Matplotlib berechnet die Interpolation und Größenänderung auf dem aufgefüllten Array
und extrahiert dann den zentralen Bereich des Ergebnisses. (Extrem alte Versionen von Matplotlib (<0.63) füllten das Array nicht auf, sondern passten stattdessen die Ansichtsgrenzen an, um die betroffenen Randbereiche auszublenden.)
Dieser Ansatz ermöglicht es, die volle Ausdehnung eines Arrays ohne Randeffekte zu plotten und beispielsweise mehrere Bilder unterschiedlicher Größe mit unterschiedlichen Interpolationsmethoden übereinander zu schichten – siehe Layer Images . Es impliziert auch einen Leistungseinbruch, da dieses neue temporäre, aufgefüllte Array erstellt werden muss. Eine ausgeklügelte Interpolation impliziert auch einen Leistungseinbruch; Für maximale Leistung oder sehr große Bilder wird interpolation='nearest' vorgeschlagen.
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()
Ob Bilder mit dem Array-Ursprung x[0, 0] oben links oder unten rechts geplottet werden sollen, können Sie mit dem Parameter origin festlegen. 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 Herkunft und Umfang .
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()
Schließlich zeigen wir ein Bild mit einem Clip-Pfad.
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()
Verweise
In diesem Beispiel wird die Verwendung der folgenden Funktionen, Methoden, Klassen und Module gezeigt:
Gesamtlaufzeit des Skripts: ( 0 Minuten 2,555 Sekunden)