我为一个项目做了一个分层集群。 我有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(见上图)。在分析过程中,我删除了标记为“地理”的数据框的第一列(参见底部图片),因为它们是文本中的城市名称并且会搞砸分析。但我 真的 需要在群集地图中找到他们正确位置的城市名称,因为我需要根据结果选择城市列表。
我应该编写什么代码才能将“地理位置”列中的城市名称插入此图中,与其行名相对应?
正如您从数据框(底部图片)中看到的那样,所有城市名称都按字母顺序排列,整齐地按升序排列,就像行名称一样。我确定将城市名称放在情节上并不难,我只是通过谷歌搜索并四处寻找它。
答案 0 :(得分:3)
我认为您所问的是“我如何决定树形图中的标签”。所以这有两个部分。例如,让我们使用数字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)
答案 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)
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()
。