gpt4 book ai didi

python - 在数据矩阵上绘制层次聚类的结果

转载 作者:IT老高 更新时间:2023-10-28 20:33:56 25 4
gpt4 key购买 nike

如何在 Python 中在值矩阵的顶部绘制树状图,并适本地重新排序以反射(reflect)聚类?下图就是一个例子:

enter image description here

这是来自 A panel of induced pluripotent stem cells from chimpanzees: a resource for comparative functional genomics 的图 6

我使用 scipy.cluster.dendrogram 来制作我的树状图并对数据矩阵执行层次聚类。然后如何将数据绘制为矩阵,其中行已重新排序以反射(reflect)在特定阈值处切割树状图引起的聚类,并将树状图绘制在矩阵旁边?我知道如何在 scipy 中绘制树状图,但不知道如何使用右侧比例尺绘制数据的强度矩阵。

最佳答案

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

如果是这样,那么试试这个(2010 年 6 月 13 日编辑,以反射(reflect)两个不同的树状图)。

python 3.10matplotlib 3.5.1

中测试
import numpy as np
import matplotlib.pyplot as plt
import scipy.cluster.hierarchy as sch
from scipy.spatial.distance import squareform

# Generate random features and distance matrix.
np.random.seed(200) # for reproducible data
x = np.random.rand(40)
D = np.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 = plt.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=plt.cm.YlGnBu)
axmatrix.set_xticks([]) # remove axis labels
axmatrix.set_yticks([]) # remove axis labels

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

enter image description here


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


编辑:add_axes (see documentation here) 接受列表或元组:(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)See example here.

关于python - 在数据矩阵上绘制层次聚类的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2982929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com