如何更改树状图绘图中节点标签

4
我为一个项目做了层次聚类分析。 我有300个观测值,每个观测值有20个变量。 我对所有变量进行了索引,使得每个变量的取值在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的数字(见上图)。在分析过程中,我删除了数据框的第一列,它被标记为“地理”(见下图),因为它们是文本中的城市名称,会影响分析。但是我真的需要将城市名称放在聚类图中的正确位置,因为我需要根据结果选择城市列表。
我应该编写什么代码将“地理”列中的城市名称插入到此图中,对应于它们的行名?
正如您可以从数据框(下图)中看到的那样,所有城市名称都按字母顺序排列,整齐地按升序排列,就像行名一样。我相信将城市名称放在图上并不难,我只是无法通过谷歌和询问找到它。

enter image description here How to alter the label of the nodes? Right now it's numbers but I need them to be cities.

enter image description here


请习惯提供可复制粘贴运行的可重现代码,以便访问者和读者更容易理解。例如,不要仅给出 all_data,数据集的截图也不太有帮助;最好提供 dput(my_data) 的结果。 - lukeA
谢谢您的建议,我会在未来加以实践。 - Elan
为什么不现在就改进你的问题?(https://dev59.com/eG025IYBdhLWcg3whGSx) - Jaap
2个回答

3
我认为您所问的是“如何确定树状图中的标签”。这有两个部分。例如,让我们使用数字c(1,2,5,6)的简单数据。
1)当您使用dist创建hclust时,它使用项目的名称。如果它们不存在,则使用运行索引。例如:
x <- c(1,2,5,6)
d1 <- as.dendrogram(hclust(dist(x)))
plot(d1)

enter image description here

这显然是一个问题,因为我们所拥有的项目是1,2,5,6而不是1:4!那么我们该如何解决呢?一种方法是更新名称。例如:
x <- c(1,2,5,6)
names(x) <- x
x
d2 <- as.dendrogram(hclust(dist(x)))
plot(d2)

enter image description here

我相信这基本上解决了你的问题(而且说实话,不需要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)

enter image description here

以下是如何处理更复杂的数据对象(我们可能不想修改对象的行名称,而是要更新树状图)的方法:
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)

enter image description here


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)

![enter image description here

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)

这里输入图片描述

提示:我发现将树状图保存为PDF格式很有用,您可以轻松地放大和缩小:pdf(“my.pdf”); plot(hc); dev.off()


尝试了这个解决方案后返回了错误...最终使用素描本手动输入字符值,根据行号来进行操作哈哈,不过等我有时间了再继续探索。 - Elan
你尝试了什么解决方案?它返回了什么错误信息?你应该编辑你的帖子并添加数据以及完整的代码来重现你的问题。否则无法提供帮助。 - lukeA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接