2017-02-17 7 views
-1

Есть ли простой способ построения 2D-данных со средствами интенсивности пикселей вдоль осей x и y по бокам изображения? аналогично seaborn's jointplot(doc), но с использованием массива 2D numpy в качестве входа? Или, может быть, массив numpy может быть легко преобразован в форму, которая может быть нанесена на график?средние выступы вдоль осей массива изображения в python

Уродливое обходное решение будет следующим, где я преобразую изображение в координаты x и y. Тогда я могу использовать jointplot, но вывод изображения довольно уродлив.

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

Пока не ясно, что вы ожидаете от гистограмма интенсивности пикселя вдоль оси x или y. Можете ли вы рассказать об этом? – kazemakase

+0

Я нашел довольно хорошее решение здесь: http://stackoverflow.com/questions/20525983/matplotlib-imshow-a-2d-array-with-plots-of-its-marginal-densities – jlarsch

+0

не совсем гладкий, как морской, но хорошее начало – jlarsch

ответ

0

вдохновлен предложением в link в мой комментарий, я придумал следующую prettified версии:

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