【问题标题】:How to change node labels of dendrogram plot [closed]如何更改树状图的节点标签
【发布时间】:2016-07-27 12:49:04
【问题描述】:

我为一个项目做了一个层次集群。 我有 20 个变量中的每一个有 300 个观察值。 我对所有变量进行了索引,使每个变量都介于 0 和 1 之间,值越大越好。

我使用以下代码创建了一个聚类图。

d_data <- dist(all_data[,-1])
d_data_ind <- dist(data_ind[,-1])
hc_data_ind <- hclust(d_data_ind, method = "complete")
dend<- as.dendrogram(hc_data_ind)
plot(dend)

现在节点的标签在行名中,数字 1 到 300(见上图)。在分析过程中,我删除了数据框中标有“地理”的第一列(见下图),因为它们是文本中的城市名称,会搞砸分析。但我真的需要在集群图的正确位置获取城市名称,因为我需要根据结果选择城市列表。

我应该写什么代码将“地理”列中的城市名称插入到这个图中,对应于它们的行名?

从数据框(下图)可以看出,所有城市名称都是按字母顺序排列的,按升序排列,就像行名称一样。我确信将城市名称放到情节中并不难,只是通过谷歌搜索和四处询问都找不到。

【问题讨论】:

  • 请习惯于提供可重现的代码,准备好复制-粘贴-运行,以方便访问者和读者。 (例如,all_data 没有给出;数据集的屏幕截图没有帮助;提供dput(my_data) 的结果是可行的方法。)
  • 谢谢你的建议,我以后会练习的

标签: r hierarchical-clustering dendrogram unsupervised-learning dendextend


【解决方案1】:

我认为您要问的是“我如何确定树状图中的标签”。所以这有两个部分。比如我们用数字c(1,2,5,6)的简单数据

1) 当您使用 dist 创建 hclust 时,它使用项目的名称。如果它们不存在,那么它使用运行索引。例如:

x <- c(1,2,5,6)
d1 <- as.dendrogram(hclust(dist(x)))
plot(d1)

这显然是个问题,因为我们的项目是 1,2,5,6 而不是 1:4!那么我们该如何解决这个问题呢?一种方法是更新名称。例如:

x <- c(1,2,5,6)
names(x) <- x
x
d2 <- as.dendrogram(hclust(dist(x)))
plot(d2)

我相信这基本上可以解决您的问题(坦率地说,不需要dendextend)。但是,如果您想在创建树状图后更新文本 - 请继续阅读:

2) dendextend 包允许您更新树状图的标签。但是您需要确保使用正确的顺序(因为原始向量的顺序和树中标签的顺序不一样!)。以下是它的实现方法:

if (!require(dendextend)) install.packages(dendextend);
library(dendextend)
x <- c(1,2,5,6)
d3 <- as.dendrogram(hclust(dist(x)))
labels(d3) <- x[order.dendrogram(d3)]
plot(d3)

对于更复杂的数据对象(我们可能不想使用对象的行名,而是要更新树状图),我们将如何做到这一点:

if (!require(dendextend)) install.packages(dendextend);
library(dendextend)
x <- CO2[,4:5]
d4 <- as.dendrogram(hclust(dist(x)))
labels(d4) <- apply(CO2[,1:3], 1, paste, collapse = "_")[order.dendrogram(d4)]

d4 <- set(d4, "labels_cex", 0.6)
d4 <- color_branches(d4, k = 3)
par(mar = c(3,0,0,6))
plot(d4, horiz = T)

【讨论】:

    【解决方案2】:

    您想要原始标签而不是 ID?也许这可以帮助您进行分析:

    data <- USArrests[1:5, ]
    data <- cbind(label=row.names(data), data)
    row.names(data) <- NULL
    d <- dist(data[, -1])
    hc <- hclust(d)
    plot(hc)
    rect.hclust(hc, h=40)
    

    data$label[order.dendrogram(as.dendrogram(hc))]
    # [1] "Arkansas"   "Arizona"    "California" "Alabama"    "Alaska"  
    
    clusters <- cutree(hc, h=40)
    split(data$label, clusters)
    # $`1`
    # [1] "Alabama" "Alaska" 
    # 
    # $`2`
    # [1] "Arizona"    "California"
    # 
    # $`3`
    # [1] "Arkansas"
    
    hc$labels <- data$label
    plot(hc)
    

    PS:我发现将树状图保存为 pdf 很有帮助,您可以在其中轻松放大和缩小:pdf("my.pdf"); plot(hc); dev.off()

    【讨论】:

    • 试过这个解决方案并返回错误...最终使用速写本根据行号手动输入字符值lol,但有时间我会更多地戳
    • "尝试了这个解决方案并返回错误.." - 你到底尝试了什么,它返回了什么错误信息?您应该编辑您的帖子并添加数据以及完整的代码以重现您的问题。否则无法提供帮助。
    猜你喜欢
    • 2016-02-10
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 2012-05-27
    • 2021-12-23
    • 2018-10-06
    • 2018-08-26
    • 1970-01-01
    相关资源
    最近更新 更多