表示在python中沿图像阵列轴的投影

时间:2017-02-17 13:14:15

标签: python pandas numpy seaborn

是否有一种简单的方法可以沿着图像两侧的x轴和y轴以像素强度的方式绘制2D数据?类似于seaborn的jointplot (doc),但使用2D numpy数组作为输入?或者也许numpy数组可以很容易地转换成可以分散绘制的形式?

以下是一个丑陋的解决方法,我将图像转换为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

1 个答案:

答案 0 :(得分:0)

受到我评论中link中的建议的启发,我想出了以下美化版本:

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