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

如何在树状图中扩展叶节点的长度并添加节点标签

  •  1
  • Sathish  · 技术社区  · 6 年前

    我的任务是创建一个树状图,但叶节点显示钝边。如何延长叶节点的长度并添加节点标签?

    请参见下面的当前和预期图像。

    数据:

    df1 <- data.frame( z1 = c(rep('P1', 5), rep('P2', 5), rep('P3', 3), rep('P4', 4)),
                       z2 = c(letters[1:5], letters[6:10], letters[11:13], letters[14:17]),
                       stringsAsFactors = FALSE)
    

    代码:

    library('data.table')
    library('ggplot2')
    library('ggdendro')
    library('grid')
    
    setDT(df1)
    ddata <- dcast( data = df1[, .(z1, z2)],
                    formula = z2 ~ z1, 
                    fill = 0, 
                    fun.aggregate = length, 
                    value.var = 'z2')
    setDF( ddata)
    row.names(ddata) <- ddata$z2
    ddata$z2 <- NULL
    ddata <- dendro_data( as.dendrogram( hclust( dist( ddata), method = "average")))
    p <- ggplot(segment(ddata)) + 
      geom_segment(aes(x = x, y = y, xend = xend, yend = yend)) + 
      theme_dendro()
    print(p)
    

    当前绘图:

    enter image description here

    预期绘图:

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  1
  •   Shaun Wilkinson    6 年前

    有几种方法可以做到这一点,最简单的方法可能是使用 dendrapply

    如果插入新行以指定树状图对象:

    dendro <-  as.dendrogram(hclust(dist(ddata), method = "average"))
    

    然后创建一个简单函数,将叶节点的高度减少给定数量(d):

    dropleaf <- function(x, d = 1){
      if(is.leaf(x)) attr(x, "height") <- attr(x, "height") - d
      return(x)
    }
    

    该功能可应用于所有节点,如下所示:

    dendro <- dendrapply(dendro, dropleaf, d = 0.2)
    

    如果要绘制轴,可以重新缩放打印,以便使用以下方法将最低点重置为零:

    dendro <- phylogram::reposition(dendro, shift = "reset")
    

    然后,您可以继续执行其余代码。。

    ddata <- dendro_data(dendro)
    p <- ggplot(segment(ddata)) + 
      geom_segment(aes(x = x, y = y, xend = xend, yend = yend)) + 
      theme_dendro()
    print(p)
    

    产生以下输出:

    dendrogram