树枝切割和簇周围的矩形,用于R中的水平树状图

Cro*_*ops 8 r dendrogram hclust ggdendro dendextend

我试图将层次聚类的结果绘制R为树状图,矩形识别聚类.

下面的代码用于垂直树形图,但对于水平树形图(horiz=TRUE),不绘制矩​​形.有没有办法对水平树形图做同样的事情.

library("cluster")
dst <- daisy(iris, metric = c("gower"), stand = FALSE)
hca <- hclust(dst, method = "average")
plot(as.dendrogram(hca), horiz = FALSE)
rect.hclust(hca, k = 3, border = "red")
Run Code Online (Sandbox Code Playgroud)

此外,我想绘制一条线来切割所需距离值的树.如何在R中绘制该cutree函数.函数返回聚类,但是也可以绘制它.

cutree(hca, k = 3)
Run Code Online (Sandbox Code Playgroud)

我正在寻找的所需输出是这样的.

树状图

如何在R中完成这项工作?

Tal*_*ili 6

jlhoward和Backlin的答案都很好.

您还可以尝试使用dendextend专门为此类设计的软件包.它有一个rect.dendrogram类似的功能rect.hclust,但有一个horiz参数(加上对rect的边缘位置的一些控制).要查找相关高度,您可以使用该heights_per_k.dendrogram功能(使用该dendextendRcpp包时速度更快)

下面是一个简单的示例,说明如何获得与上面示例中相同的结果(还有彩色分支的额外奖励,只是为了好玩):

install.packages("dendextend")
install.packages("dendextendRcpp")

library("dendextend")
library("dendextendRcpp")

# using piping to get the dend
dend <- iris[,-5] %>% dist %>% hclust %>% as.dendrogram

# plot + color the dend's branches before, based on 3 clusters:
dend %>% color_branches(k=3) %>% plot(horiz=TRUE, main = "The dendextend package \n Gives extended functionality to R's dendrogram object")

# add horiz rect
dend %>% rect.dendrogram(k=3,horiz=TRUE)

# add horiz (well, vertical) line:
abline(v = heights_per_k.dendrogram(dend)["3"] + .6, lwd = 2, lty = 2, col = "blue")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


jlh*_*ard 5

这是使用ggplotggdendro包装的解决方案。另外,我们还可以按簇为标签上色...

library(cluster)
dst   <- daisy(iris, metric = c("gower"), stand = FALSE)
hca   <- hclust(dst, method = "average")
k     <- 3
clust <- cutree(hca,k=k)  # k clusters

library(ggplot2)
library(ggdendro)     # for dendro_data(...)
dendr    <- dendro_data(hca, type="rectangle") # convert for ggplot
clust.df <- data.frame(label=rownames(iris), cluster=factor(clust))
dendr[["labels"]]   <- merge(dendr[["labels"]],clust.df, by="label")
rect <- aggregate(x~cluster,label(dendr),range)
rect <- data.frame(rect$cluster,rect$x)
ymax <- mean(hca$height[length(hca$height)-((k-2):(k-1))])

ggplot() + 
  geom_segment(data=segment(dendr), aes(x=x, y=y, xend=xend, yend=yend)) + 
  geom_text(data=label(dendr), aes(x, y, label=label, hjust=0, color=cluster), 
            size=3) +
  geom_rect(data=rect, aes(xmin=X1-.3, xmax=X2+.3, ymin=0, ymax=ymax), 
            color="red", fill=NA)+
  geom_hline(yintercept=0.33, color="blue")+
  coord_flip() + scale_y_reverse(expand=c(0.2, 0)) + 
  theme_dendro()
Run Code Online (Sandbox Code Playgroud)