2016-07-26 10 views
0

Das folgende CodefragmentSkalieren von Bildern, die durch imshow

import matplotlib.pyplot as plt 
import numpy as np 

arr1 = np.arange(100).reshape((10,10)) 
arr2 = np.arange(25).reshape((5,5)) 

fig, (ax1, ax2,) = plt.subplots(nrows=2, figsize=(3,5)) 
ax1.imshow(arr1, interpolation="none") 
ax2.imshow(arr2, interpolation="none") 

plt.tight_layout() 
plt.show() 

zwei Bilder mit der gleichen Größe erzeugt, aber eine viel niedrigere „Pixeldichte“ in dem zweiten.

enter image description here

Ich möchte das zweite Bild auf der gleichen Skala aufgetragen haben (dh Pixeldichte) der ersten, ohne die subfigure Füllung, möglicherweise korrekt ausgerichtet sind (dh der Ursprung des Bildes in der gleichen subplot Position als die erste.)

bearbeiten

die Formen der arr1 und arr2 sind nur ein Beispiel, das Problem zu zeigen. Nach was ich suche, ist eine Weise, um sicherzustellen, dass zwei verschiedene Bilder, die von imshow in verschiedenen Teilen der Abbildung erzeugt werden, im genau gleichen Maßstab gezeichnet werden.

+0

Was ist gerade vor dem Plotten Ihre 2D-Matrizen interpoliert? Es sollte viele Methoden in scipy oder scikit-image geben. Letzteres sollte einfacher zu bedienen sein, da es sofort einsatzbereit ist [resize] (http://scikit-image.org/docs/dev/api/skimage.transform.html#skimage.transform.resize). – sascha

+0

@sascha Ich brauche, dass der zweite Plot (der weniger Pixel hat) kleiner gemacht wird als der erste, so dass die xy-Skalen beider Bilder gleich sind. BTW Ich zeichne Daten, nicht Bilder, so ist es wichtig, dass die einzelnen "Pixel" mit ihren ungefähren Koordinaten sichtbar bleiben. Auch eine auf 'pcolormesh' basierende Lösung ist akzeptabel. –

Antwort

1

Die einfachste Sache, an die ich denken konnte, funktionierte nicht, aber gridspec tut. Die Ursprünge sind hier nicht explizit ausgerichtet, sie nutzen nur die Vorteile aus, wie gridspec Zeilen füllt (und es gibt ein unbenutztes Unterplot als Spacer).

import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib import gridspec 

sizes = (10, 5) 
arr1 = np.arange(sizes[0]*sizes[0]).reshape((sizes[0],sizes[0])) 
arr2 = np.arange(sizes[1]*sizes[1]).reshape((sizes[1],sizes[1])) 


# Maybe sharex, sharey? No, we pad one and lose data in the other 
#fig, (ax1, ax2,) = plt.subplots(nrows=2, figsize=(3,5), sharex=True, sharey=True) 
fig = plt.figure(figsize=(3,5)) 

# wspace so the unused lower-right subplot doesn't squeeze lower-left 
gs = gridspec.GridSpec(2, 2, height_ratios = [sizes[0], sizes[1]], wspace = 0.0) 

ax1 = plt.subplot(gs[0,:]) 
ax2 = plt.subplot(gs[1,0]) 


ax1.imshow(arr1, interpolation="none") 
ax2.imshow(arr2, interpolation="none") 

plt.tight_layout() 
plt.show() 

enter image description here

+0

Die Lösung ist OK, nach der Bearbeitung. Es tut mir leid, aber ich habe deine Bearbeitung verpasst, mein Kommentar bezieht sich auf die erste Lösung und ich werde sie löschen. –

Verwandte Themen