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

在python中绘制数据矩阵上的层次聚类结果,python,cluster-analysis,machine-learning,matplotlib,scipy,Python,Cluster Analysis,Machine Learning,Matplotlib,Scipy,在Python中,如何在值矩阵的正上方绘制树状图,并适当地重新排序以反映集群?下图是一个示例: 我使用scipy.cluster.dendrogram生成树状图,并对数据矩阵执行层次聚类。然后,如何将数据绘制为矩阵,其中行已重新排序,以反映在特定阈值下切割树状图导致的聚类,并将树状图绘制在矩阵旁边?我知道如何在scipy中绘制树状图,但不知道如何用右边的比例尺绘制数据的强度矩阵 如果您能在这方面提供任何帮助,我们将不胜感激。这个问题并没有很好地定义矩阵:“价值矩阵”、“数据矩阵”。我想你指的是

在Python中,如何在值矩阵的正上方绘制树状图,并适当地重新排序以反映集群?下图是一个示例:

我使用scipy.cluster.dendrogram生成树状图,并对数据矩阵执行层次聚类。然后,如何将数据绘制为矩阵,其中行已重新排序,以反映在特定阈值下切割树状图导致的聚类,并将树状图绘制在矩阵旁边?我知道如何在scipy中绘制树状图,但不知道如何用右边的比例尺绘制数据的强度矩阵


如果您能在这方面提供任何帮助,我们将不胜感激。

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

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

祝你好运!如果你需要更多的帮助,请告诉我


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


编辑:
add_axes
()接受列表或元组:
(左、下、宽、高)
。例如,
(0.5,0,0.5,1)
在图形的右半部分添加一个
轴。
(0,0.5,1,0.5)
在图形的上半部分添加一个

大多数人可能使用
add_子图
以方便使用。我喜欢为它的控制添加轴


若要删除边框,请使用
添加轴([左、下、宽、高]、frame\u on=False)

如果除矩阵和树状图外,还需要显示元素的标签,则可以使用以下代码,显示所有标签旋转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])
获得的结果如下(使用不同的颜色贴图):


这更像是一个matplotlib问题,我已重新标记。可能重复:请更新图片链接。这是一个很好的问题。还有几个问题:如何在顶部显示样本的聚类?如果矩阵是按样本划分的基因,那么您已经在左侧显示了基因,但我想在顶部显示样本聚类。如何适当地调整轴以达到此目的?另外,如何将颜色贴图调整为黄色到蓝色,并控制右侧栏的比例?非常感谢!我上传了一个带有不同颜色地图的图形。请参见编辑。你能定义“基因”和“样本”吗?相似性是如何计算的?尽管如此,我还在矩阵上方添加了第二个树状图。希望你能调整它,因为你认为合适。谢谢史蒂夫,这回答了我关于顶部树状图的问题。另一个简单的说明:如何设置add_轴的参数?我不确定你是如何选择这些数值的。例如,我想移除树状图周围的框,只显示树。如果这些是常规子批次,我可以在subplot.ax.spines中的每个脊椎上“设置颜色(无)”。我可以在这里做同样的事情吗?我认为你使用联动功能的方式是错误的。如果查看linkage()的源代码,如果第一个参数(这里使用D)是一个矩阵,它将被视为数据,而不是距离。要输入距离,必须取D的上三角形,将其转换为一维向量,然后将其传递给linkage()。这个答案非常有用!但是,正如@danioyuan所提到的,
链接
函数的用法现在似乎是错误的。使用距离矩阵,将其转换为向量形式的距离矩阵。i、 e.
D=squareform(D)
在使用
链接之前。
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])