在 Scipy/Matplotlib 中注释树状图节点

     2023-02-19     184

关键词:

【中文标题】在 Scipy/Matplotlib 中注释树状图节点【英文标题】:Annotating Dendrogram nodes in Scipy/Matplotlib 【发布时间】:2015-07-30 19:30:17 【问题描述】:

我正在尝试在scipy.cluster.hierarchy.dendrogram 生成的树状图中标记节点。

我正在使用augmented dendrogram suggested here,尝试将示例中的集群间距离标签 (1.01,1.57) 替换为 ('a+c','a+b+c') 等字符串。

下面是一个示例链接矩阵

Z = array([[ 2,  7,  0,  2],
           [ 0,  9,  0,  2],
           [ 1,  6,  0,  2],
           [ 5, 10,  0,  3],
           [11, 12,  0,  4],
           [ 4,  8,  0,  2],
           [14, 15,  0,  6],
           [13, 16,  0,  9],
           [ 3, 17,  1, 10]])

对于这个例子,我创建了如下临时标签:

labels = [str(Z[ind,0].astype(int))+'+'+str(Z[ind,1].astype(int)) for ind in range(len(Z))]

并将augmented_dendrogram修改为:

def augmented_dendrogram(labels,*args, **kwargs):
    ddata = cl.dendrogram(*args, **kwargs)
    if not kwargs.get('no_plot', False):
        for ind,(i, d) in enumerate(zip(ddata['icoord'], ddata['dcoord'])):
            x = 0.5 * sum(i[1:3])
            y = d[1]
            plt.plot(x, y, 'ro')
            plt.annotate(labels[ind], (x, y), xytext=(10,15),
                         textcoords='offset points',
                         va='top', ha='center')
return ddata

但是,生成的标签未与树状图中的节点对齐:

如何将标签与正确的节点对齐?

【问题讨论】:

【参考方案1】:

如果我正确理解您的问题,那么您正在寻找由 scipy 的 dendrogram 函数返回的字典中的字段 'leaves'。根据 scipy 的documentation:

对于每个 i,H[i] == j,簇节点 j 出现在叶子从左到右遍历的位置 i 中,其中 和 。如果 j 小于 n,则第 i 个叶节点对应于原始观察。否则,它对应于非单例集群。

简而言之,这意味着您可以使用此字段将标签排序为正确的顺序,例如通过将相应的行更改为:

plt.annotate(labels[ddata['leaves'][ind]], (x, y), xytext=(10,15), textcoords='offset points', va='top', ha='center')

【讨论】:

据我判断,这个解决方案行不通,因为ddata['leaves'] 只包括叶子(即只有终端,但不包括内部节点)。【参考方案2】:

这是我在处理类似问题时找到的解决方案。请注意,OP 中给出的链接矩阵缺少距离(第三列)。我人为地插入这些距离,然后使用它们来识别树状图中节点的正确索引。 scipy distance 函数生成距离已经排序的链接矩阵(至少在使用 ward 作为链接方法时)。

这是我的代码:

    Z = np.array([[ 2,  7,  0,  2],
           [ 0,  9,  0,  2],
           [ 1,  6,  0,  2],
           [ 5, 10,  0,  3],
           [11, 12,  0,  4],
           [ 4,  8,  0,  2],
           [14, 15,  0,  6],
           [13, 16,  0,  9],
           [ 3, 17,  1, 10]], dtype=float)

    Z[:, 2] = np.arange(1., len(Z)+1)
    labels = [str(len(Z)+1+ind)+'='+str(Z[ind,0].astype(int))+'+'+str(Z[ind,1].astype(int)) for ind in range(len(Z))]

    fig, ax = plt.subplots(1, 1, figsize=(10, 10))
    dn = dendrogram(Z, ax=ax)
    ii = np.argsort(np.array(dn['dcoord'])[:, 1])
    for j, (icoord, dcoord) in enumerate(zip(dn['icoord'], dn['dcoord'])):
        x = 0.5 * sum(icoord[1:3])
        y = dcoord[1]
        ind = np.nonzero(ii == j)[0][0]
        ax.annotate(labels[ind], (x,y), va='top', ha='center')
    plt.tight_layout()
    plt.savefig('./tmp.png')
    plt.close(fig)

结果是:

【讨论】:

如何在 heatmap.2 中展开树状图

】如何在heatmap.2中展开树状图【英文标题】:Howtoexpandthedendograminheatmap.2【发布时间】:2014-03-2520:15:34【问题描述】:我有以下带有树状图的热图。完整数据为here。问题是左边的树状图被压扁了。如何在不改变热图列大小的情况... 查看详情

怎样用excel做树状图?

...在弹出的对话框中选择“层次结构。4、随意选择了一种树状图,弹出的树状图如下,图中的文字部分可以更改成需要的内容。5、更改树状图形状:选择任意需要更改的树状图单元,鼠标右键单击,在弹出的菜单中选择“更改形... 查看详情

在R中使用dendextend修改树状图

】在R中使用dendextend修改树状图【英文标题】:DendrogrammodificationusingdendextendinR【发布时间】:2016-08-1313:43:08【问题描述】:我正在尝试使用dendextend修改和调整集群树状图,使用以下代码:#preparehierarchicalclusterhc=hclust(dist(mtcars))den... 查看详情

如何手动创建树状图(或“hclust”)对象? (在 R 中)

】如何手动创建树状图(或“hclust”)对象?(在R中)【英文标题】:HowdoImanuallycreateadendrogram(or"hclust")object?(inR)【发布时间】:2011-01-1915:14:24【问题描述】:我有一个树状图作为图像提供给我。由于它不是很大,我可以... 查看详情

numpy、scipy、matplotlib 和 pylab 之间的混淆

】numpy、scipy、matplotlib和pylab之间的混淆【英文标题】:Confusionbetweennumpy,scipy,matplotlibandpylab【发布时间】:2012-10-1020:34:50【问题描述】:Numpy、scipy、matplotlib和pylab是使用python进行科学计算的常用术语。我刚学了一点pylab,就搞糊... 查看详情

如何在 matplotlib 中调整树状图的分​​支长度(如在 astrodendro 中)? [Python]

】如何在matplotlib中调整树状图的分​​支长度(如在astrodendro中)?[Python]【英文标题】:Howtoadjustbranchlengthsofdendrograminmatplotlib(likeinastrodendro)?[Python]【发布时间】:2018-11-2314:09:35【问题描述】:下面是我的结果图,但我希望它看... 查看详情

在 scipy 中修剪树状图(分层聚类)

】在scipy中修剪树状图(分层聚类)【英文标题】:Pruningdendrograminscipy(hierarchicalclustering)【发布时间】:2012-05-0512:21:14【问题描述】:我有一个包含大约5000个条目的距离矩阵,并使用scipy的层次聚类方法对矩阵进行聚类。我用于... 查看详情

在 Scipy 错误中为大型数据集绘制树状图

】在Scipy错误中为大型数据集绘制树状图【英文标题】:PlottingdendrograminScipyerrorforlargedataset【发布时间】:2012-04-2913:21:30【问题描述】:我正在使用Scipy进行层次聚类。我确实设法使用fcluster在阈值上获得平坦的集群。但我需要可... 查看详情

您如何比较两个树状图(在 R 中)之间的“相似性”?

】您如何比较两个树状图(在R中)之间的“相似性”?【英文标题】:Howdoyoucomparethe"similarity"betweentwodendrograms(inR)?【发布时间】:2010-02-0721:23:28【问题描述】:我有两个树状图,我希望将它们相互比较,以了解它们有多... 查看详情

ppt中怎么做树状图

...式后插入PPT,更改颜色和输入文本后保存,就能在ppt中做树状图。具体操作请参照以下步骤。1、在电脑上打开PPT软件新建一个文档,在菜单栏“插入”选项中选择smartart图形。2、在找开的smartart全部图形中,选择一个自己喜欢的... 查看详情

带有名称的 Scipy 树状图

】带有名称的Scipy树状图【英文标题】:Scipydendrogramwithnames【发布时间】:2016-10-2606:34:13【问题描述】:我在工作中使用来自thispost的示例树状图,但也想跟踪哪一行/哪列来自哪条数据。我已将数据名称记录为names的代码编辑如... 查看详情

sklearn库

...it-learn:一组简单有效的工具集。依赖Python和NumPy、SciPy、matplotlib库。是开源和可复用的Sklearn是Scikit-learn的简称,是基于Python的第三方模块,集成了常用的机器学习方法,在进行学习任务时,并不需要实现算法,只需要简单的调... 查看详情

在 jupyter notebook 中使用 plotly python 绘制具有不等热图的交互式树状图

...在jupyternotebook中使用plotlypython绘制具有不等热图的交互式树状图【英文标题】:plottinginteractiveDendrogramwithanunequalHeatmapusingplotlypythoninjupyternotebook【发布时间】:2021-09-1606:43:23【问题描述】:我正在尝试使用looklikethisone的Plotly包在j... 查看详情

如何根据定义的组为树状图的标签着色? (在 R 中)

】如何根据定义的组为树状图的标签着色?(在R中)【英文标题】:Howtocoloradendrogram\'slabelsaccordingtodefinedgroups?(inR)【发布时间】:2015-09-1601:03:58【问题描述】:我在R中有一个24行10,000列的数字矩阵。这个矩阵的行名基本上是文... 查看详情

在距离高度从 SciPy 切割树状图/聚类树

】在距离高度从SciPy切割树状图/聚类树【英文标题】:CuttingDendrogram/ClusteringTreefromSciPyatdistanceheight【发布时间】:2016-07-3103:28:52【问题描述】:我正在尝试学习如何在Python中使用dendrograms使用SciPy。我想获得集群并能够可视化它... 查看详情

mac安装numpy,scipy,matplotlib

p.p1{margin:0.0px0.0px0.0px0.0px;font:18.0px"CourierNew";color:#000000;background-color:#ffffff}span.s1{} p.p1{margin:0.0px0.0px0.0px0.0px;font:18.0px"CourierNew";color:#000000;background-color:# 查看详情

在html网页中如何实行树状图显示呀

参考技术A用以下代码结构模拟树形:<ul><li><ul><li></li><li></li></ul></li><li></li></ul> 参考技术B1、用table或div结合ul排版本回答被提问者采纳 查看详情

来自预制链接矩阵的树状图

】来自预制链接矩阵的树状图【英文标题】:dendrogramfrompre-madelinkagematrix【发布时间】:2021-09-2017:09:41【问题描述】:问题:在R中,我需要绘制一个树状图+从用不同语言创建的链接矩阵中切割关联的树。根据数据集的性质,之... 查看详情