2017-02-17 2 views
-1

Gibt es eine einfache Möglichkeit, 2D-Daten mit Mitteln der Pixelintensität entlang der X-und Y-Achsen an den Seiten des Bildes zu plotten? ähnlich wie Seaborns jointplot(doc) aber mit einem 2D-Numpy-Array als Eingabe? Oder kann das numpy Array leicht in eine Form umgewandelt werden, die Scatterploted sein kann?mittlere Projektionen entlang Bild-Array-Achsen in Python

Eine hässliche Problemumgehung wäre die folgende, wo ich das Bild in x- und y-Koordinaten umwandele. Dann kann ich jointplot verwenden, aber die Bildausgabe ist ziemlich hässlich.

img=#some 2d image data 
xx=np.zeros(img.sum()) 
yy=np.zeros(img.sum()) 
i=0 
for x in range(img.shape[0]): 
    for y in range(img.shape[1]): 
     for c in range(img[x,y]): 
      xx[i]=x 
      yy[i]=y 
      i+=1 

import seaborn as sns    
sns.jointplot(yy,xx) 

enter image description here

+0

Es ist nicht klar, was Sie erwarten von ein Histogramm der Pixelintensität entlang der x- oder y-Achse. Können Sie das näher ausführen? – kazemakase

+0

Ich fand eine ziemlich gute Lösung hier: http://stackoverflow.com/questions/20525983/matplotlib-imshow-a-2d-array-with-plots-of-its-marginal-densities – jlarsch

+0

nicht ganz so glatt wie Seaborn aber ein guter Anfang – jlarsch

Antwort

0

durch den Vorschlag in der in meinem Kommentar link inspiriert, kam ich auf die folgende prettified Version auf:

from matplotlib import gridspec 
img=tmp 
fig=plt.figure(figsize=(6, 6)) 
t = np.arange(img.shape[0]) 
f = np.arange(img.shape[1]) 
flim = (f.min(), f.max()) 
tlim = (t.min(), t.max()) 


gs = gridspec.GridSpec(2, 2, width_ratios=[5,1], height_ratios=[1,5]) 
gs.update(hspace=0, wspace=0) 
ax = fig.add_subplot(gs[1,0]) 
axl = fig.add_subplot(gs[1,1], sharey=ax) 
axb = fig.add_subplot(gs[0,0], sharex=ax) 
plt.setp(axl.get_yticklabels(), visible=False) 
plt.setp(axb.get_xticklabels(), visible=False) 
plt.setp(axl.get_xticklabels(), visible=False) 
plt.setp(axb.get_yticklabels(), visible=False) 

ax.imshow(img, origin='lower',aspect='equal') 

axl.fill_between(img.mean(1), f) 
axb.fill_between(t, img.mean(0)) 
ax.set_xlim(tlim) 
ax.set_ylim(tlim) 

enter image description here