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

snvhrwxg  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(151)

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

图6来自:A panel of induced pluripotent stem cells from chimpanzees: a resource for comparative functional genomics
我使用scipy.cluster.dendrogram来绘制树状图,并对数据矩阵执行层次聚类。然后,如何将数据绘制为矩阵,其中的行已重新排序,以反映在特定阈值处切割树状图所导致的聚类,并将树状图绘制在矩阵旁边?我知道如何在scipy中绘制树状图。但不知道如何用旁边的右刻度条绘制数据的强度矩阵。

qacovj5a

qacovj5a1#

这个问题并没有很好地定义 matrix:“值的矩阵”,“数据的矩阵”。我假设你指的是一个 * 距离矩阵 *。换句话说,在对称的非负N乘N * 距离矩阵 * D中的元素D_ij表示两个特征向量x_i和x_j之间的距离。对吗?
如果是这样,那么试试这个(编辑于2010年6月13日,以反映两个不同的树状图)。

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')

编辑:对于不同的颜色,调整imshow中的cmap属性。请参见scipy/matplotlib docs中的示例。该页面还介绍了如何创建自己的色彩Map表。为了方便起见,我建议使用预先存在的色彩Map表。在我的示例中,我使用了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)See example here.

ej83mcc0

ej83mcc02#

如果除了矩阵和树状图之外,还需要显示元素的标签,则可以使用以下代码,该代码显示所有标签,旋转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])

获得的结果如下(使用不同的颜色贴图):

相关问题