2016-12-21 10 views
1

Ich habe folgende Code, der das Ergebnis einer Gauß'schen Pyramide stellt -pyplot - wie Bild zu zeigen, auf der Oberseite

fig = plt.figure(1) 
plt.figimage(gp[0], cmap=plt.cm.gray) 
plt.figimage(gp[1], 512, cmap=plt.cm.gray) 
plt.figimage(gp[2], 512 + 256, cmap=plt.cm.gray) 
plt.figimage(gp[3], 512 + 256 + 128, cmap=plt.cm.gray) 
plt.figimage(gp[4], 512 + 256 + 128 + 64, cmap=plt.cm.gray) 
plt.figimage(gp[5], 512 + 256 + + 128 + 64 + 32, cmap=plt.cm.gray) 

plt.show() 

gp ist eine Liste der Bilder des Typs np.array auf Arrays von Dimensionen bezieht 512x512, 256x256 und bald. Diese Codes erzeugt das folgende Bild: enter image description here

(das Originalbild von skimage.data.camera())

Meine Frage ist: Wie kann ich die Bilder auf der Oberseite des Bildes und nicht auf die gezeigt werden Unterseite?

+0

Sind Sie offen für einen anderen Ansatz? –

+0

natürlich alles, was funktioniert ia gut – proton

+0

In diesem Fall, viel Spaß :) –

Antwort

1

Eine bessere Art und Weise wird durch die Dokumentation von plt.figimage selbst vorgeschlagen:

figimage ergänzt die Achsen Bild (imshow()), die neu abgetastete werden die aktuellen Achsen passen. Wenn Sie möchten, dass ein neu abgetastetes Bild die gesamte Figur ausfüllt, können Sie eine Axes mit der Größe [0,1,0,1] definieren.

Links sind tatsächlich in der Online-Dokumentation vorhanden. Außerdem habe ich gerade eine PR eingereicht, um [0, 1, 0, 1] zu zu beheben.

from matplotlib import pyplot as plt 

fig = plt.figure() 
# Create axis stretched across the entire figure. anchor='N' will 
# keep it anchored to the top and left when it gets resized to fit 
# the image bounds (default is the center). 
ax = fig.add_axes([0,0,1,1], anchor='NW', frameon=False) 
# Remove the spines and ticks of the axis (frameon=False in the 
# line above made it transparent) 
ax.set_axis_off() 

offset = -0.5 
for im in gp: 
    height, width = im.shape 
    # Plot the images upside-down with origin=lower 
    ax.imshow(im, extent=[offset, offset + width, -0.5, height], origin='lower', cmap='gray') 
    offset += width 

ax.set_xlim([-0.5, offset]) 
# Flip the y-axis 
ax.set_ylim([gp[0].shape[0] - 0.5, -0.5]) 

plt.show() 

Ein wesentlicher Unterschied mit figure.figimage ist, dass die Bilder skaliert, wie Sie die Größe der Figur ändern, anstatt Abbildung auf dem Bildschirm Pixel-für-Pixel.

Getestet habe ich die folgende Definition von gp mit:

from skimage.data import camera 

g = camera() 
gp = [g[::2**x, ::2**x] for x in range(6)] 

Hier ist das Ergebnis:

enter image description here

Und hier ist ein Beispiel mit anchor nicht explizit festgelegt in fig.add_axes:

UPDATE

PR #7659 wurde angenommen, so wird die korrigierte Dokumentation für matplotlib lesen:

figimage ergänzt die Achsen Bild (imshow()), die die aktuellen Achsen passen wiederabgetasteten wird. Wenn Sie möchten, dass ein neu abgetastetes Bild die gesamte Abbildung ausfüllt, können Sie eine Axes mit Extents [0,0,1,1] definieren.

Verwandte Themen