在python中的数据矩阵顶部绘制层次聚类的结果
cluster-analysis
machine-learning
python
scipy
5
0

如何在Python中将树状图正确地绘制在值矩阵的顶部,并适当地重新排序以反映聚类?下图是一个示例:

https://publishing-cdn.elifesciences.org/07103/elife-07103-fig6-figsupp1-v2.jpg

我使用scipy.cluster.dendrogram制作树状图,并对数据矩阵执行分层聚类。然后,我如何才能将数据绘制为矩阵,在其中将行重新排序以反映通过在特定阈值处切割树状图而引起的聚类,并使树状图在矩阵旁边绘制?我知道如何以密密麻麻的方式绘制树状图,但不知道如何在数据强度矩阵旁边绘制正确的比例尺。

任何帮助,将不胜感激。

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

如果除了矩阵和树状图之外还需要显示元素的标签,则可以使用以下代码,该代码显示所有标签旋转x标签并更改字体大小以避免在x轴上重叠。它需要移动颜色栏以为y标签留出空间:

axmatrix.set_xticks(range(40))
axmatrix.set_xticklabels(idx1, minor=False)
axmatrix.xaxis.set_label_position('bottom')
axmatrix.xaxis.tick_bottom()

pylab.xticks(rotation=-90, fontsize=8)

axmatrix.set_yticks(range(40))
axmatrix.set_yticklabels(idx2, minor=False)
axmatrix.yaxis.set_label_position('right')
axmatrix.yaxis.tick_right()

axcolor = fig.add_axes([0.94,0.1,0.02,0.6])

得到的结果是这样(具有不同的颜色图):

得到的结果是这样的:

收藏
评论

这个问题不能很好地定义矩阵 :“值矩阵”,“数据矩阵”。我认为您的意思是距离矩阵 。换句话说,对称非负N×N 距离矩阵 D中的元素D_ij表示两个特征向量x_i和x_j之间的距离。那是对的吗?

如果是这样,请尝试以下操作(2010年6月13日编辑,以反映两个不同的树状图):

import scipy
import pylab
import scipy.cluster.hierarchy as sch
from scipy.spatial.distance import squareform


# Generate random features and distance matrix.
x = scipy.rand(40)
D = scipy.zeros([40,40])
for i in range(40):
    for j in range(40):
        D[i,j] = abs(x[i] - x[j])

condensedD = squareform(D)

# Compute and plot first dendrogram.
fig = pylab.figure(figsize=(8,8))
ax1 = fig.add_axes([0.09,0.1,0.2,0.6])
Y = sch.linkage(condensedD, method='centroid')
Z1 = sch.dendrogram(Y, orientation='left')
ax1.set_xticks([])
ax1.set_yticks([])

# Compute and plot second dendrogram.
ax2 = fig.add_axes([0.3,0.71,0.6,0.2])
Y = sch.linkage(condensedD, method='single')
Z2 = sch.dendrogram(Y)
ax2.set_xticks([])
ax2.set_yticks([])

# Plot distance matrix.
axmatrix = fig.add_axes([0.3,0.1,0.6,0.6])
idx1 = Z1['leaves']
idx2 = Z2['leaves']
D = D[idx1,:]
D = D[:,idx2]
im = axmatrix.matshow(D, aspect='auto', origin='lower', cmap=pylab.cm.YlGnBu)
axmatrix.set_xticks([])
axmatrix.set_yticks([])

# Plot colorbar.
axcolor = fig.add_axes([0.91,0.1,0.02,0.6])
pylab.colorbar(im, cax=axcolor)
fig.show()
fig.savefig('dendrogram.png')

情节

祝好运!让我知道您是否需要更多帮助。


编辑:对于不同的颜色,请在imshow调整cmap属性。有关示例,请参见scipy / matplotlib文档 。该页面还描述了如何创建自己的颜色图。为了方便起见,我建议使用预先存在的颜色图。在我的示例中,我使用了YlGnBu


编辑: add_axes请参见此处的文档 )接受一个列表或元组:( (left, bottom, width, height) 。例如, (0.5,0,0.5,1)在图的右半部分添加一个Axes(0,0.5,1,0.5)在图的上半部分添加一个Axes

为了方便起见,大多数人可能会使用add_subplot 。我喜欢add_axes作为控件。

要删除边框,请使用add_axes([left,bottom,width,height], frame_on=False)请参阅此处的示例。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号