代码之家  ›  专栏  ›  技术社区  ›  jk22

基于k的R图上部树状图

  •  3
  • jk22  · 技术社区  · 9 年前

    我正在使用hclust()根据R中的20000行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软件包用k个基团给树状图着色。

    library(dendextend)
    pdf("hclust_plot3.pdf", width = 40, height = 15)
    plot(color_branches(hcd, k = 44))
    dev.off()
    

    但对于我的数据集,这个树状图太密集,甚至无法读取哪一组是哪种颜色。有没有一种方法可以通过指定k而不是h来仅绘制树状图的切点上方的上部?或者在给定k的情况下,有没有办法得到树状图的h值?

    1 回复  |  直到 9 年前
        1
  •  1
  •   Tal Galili    9 年前

    您可以使用 heights_per_k.dendrogram 函数来自 the dendextend package ,以获得各种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