【问题标题】:how to extend the length of leaf node in dendrogram and add node labels如何在树状图中扩展叶节点的长度并添加节点标签
【发布时间】:2018-10-06 09:44:20
【问题描述】:

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

请查看下面的当前和预期图像。

数据:

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)

当前剧情:

预期情节:

【问题讨论】:

    标签: r ggplot2 ggdendro


    【解决方案1】:

    有几种方法可以做到这一点,最简单的可能是使用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)
    

    产生以下输出:

    【讨论】:

    • library('dendextend'); as.dendrogram( hclust( dist( ddata), method = "average")) %&gt;% set("hang_leaves", 0.5) 也可以。 dendextend::hang.dendrogram 中的 fix_height_attr_per_leaf 函数与上面的答案类似,但不完全相同。
    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多