如何更改树形图的节点标签

时间:2016-04-06 21:22:59

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

我为一个项目做了一个分层集群。 我有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(见上图)。在分析过程中,我删除了标记为“地理”的数据框的第一列(参见底部图片),因为它们是文本中的城市名称并且会搞砸分析。但我 真的 需要在群集地图中找到他们正确位置的城市名称,因为我需要根据结果选择城市列表。

我应该编写什么代码才能将“地理位置”列中的城市名称插入此图中,与其行名相对应?

正如您从数据框(底部图片)中看到的那样,所有城市名称都按字母顺序排列,整齐地按升序排列,就像行名称一样。我确定将城市名称放在情节上并不难,我只是通过谷歌搜索并四处寻找它。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)

enter image description here

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