是否有一种简单的方法可以沿着图像两侧的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)
答案 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)