基于k值绘制上层树状图的R绘图

3

我正在使用R中的hclust()函数对一个20,000行x 169列数据集基于距离矩阵进行聚类。当我将聚类对象转换为树状图并绘制整个树状图时,它难以阅读,即使我将其输出到相当大的pdf文件中。

df <- as.data.frame(matrix(abs(rnorm(3380000)), nrow = 20000))
mydist <- vegdist(df)
my.hc <- hclust(mydist, method = "average")
hcd <- as.dendrogram(my.hc)

pdf("hclust_plot.pdf", width = 40, height = 15)
plot(hcd)
dev.off()

我想指定簇数(k)来截断树状图,然后仅绘制在k分割点上方的树状图上部分。我知道可以使用函数cut()基于指定高度(h)来绘制树状图的上部分。

pdf("hclust_plot2.pdf", width = 40, height = 15)
plot(cut(hcd, h = 0.99)$upper)
dev.off()

我知道我可以使用dendextend包将聚类图中的dendrogram染成k个颜色组。
library(dendextend)
pdf("hclust_plot3.pdf", width = 40, height = 15)
plot(color_branches(hcd, k = 44))
dev.off()

但对于我的数据集来说,这个树状图太密集了,甚至无法读出哪个组是哪种颜色。是否有一种方法可以仅绘制在切点上方的树状图,而不是通过指定k而不是h来实现?或者是否有一种方法可以获得一个树状图的h值,给定k?


不深入探讨,这个项目可能会引起您的兴趣:https://github.com/thomasp85/ggraph - boshek
1
这个SO问题似乎对你提供了相当多的信息,并且参考了dendenxtend软件包:https://dev59.com/1ozda4cB1Zd3GeqPnHwm - lawyeR
1个回答

2
你可以使用dendextend包中的heights_per_k.dendrogram函数,获取各种k值切割的高度。
例如:
## Not run: 
hc <- hclust(dist(USArrests[1:4,]), "ave")
dend <- as.dendrogram(hc)

library(dendextend)
dend_h <- heights_per_k.dendrogram(dend)
par(mfrow = c(1,2))
plot(dend)
plot(dend, ylim = c(dend_h["3"], dend_h["1"]))

enter image description here

而在您的情况下:

set.seed(2016-01-16)
df <- as.data.frame(matrix(abs(rnorm(2*20000)), nrow = 20000))
mydist <- dist(df)
my.hc <- hclust(mydist, method = "average")
hcd <- as.dendrogram(my.hc)

library(dendextend)
library(dendextendRcpp)
dend_h <- heights_per_k.dendrogram(hcd) # (this can take some time)
plot(hcd, ylim = c(dend_h["43"], dend_h["1"]))

enter image description here


谢谢您的帮助。我知道如何使用color_branches()给分支上色,但是您知道我怎样才能标记这些分支,以便我可以读出哪个组属于哪个? - jk22
在color_branches中使用"groupLabels = TRUE"参数。 - Tal Galili
感谢@Tal。当我尝试使用'd1 <- color_branches(hcd, k = 43, groupLabels = TRUE)',然后'plot(d1, ylim = c(dend_h["43"], dend_h["1"]))'时,一些标签没有出现,我猜测是因为它们比最低高度还要低。有没有办法控制这些标签的位置? - jk22

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