r - 如何在树状图中扩展叶节点的长度并添加节点标签
问题描述
我的任务是创建树状图,但叶节点显示钝边。我将如何扩展叶节点的长度并添加节点标签?
请参阅下面的当前和预期图像。
数据:
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)
当前情节:
预期剧情:
解决方案
有几种方法可以做到这一点,最简单的可能是在树状图的节点上递归地应用一个函数,使用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)
产生以下输出:
推荐阅读
- javascript - why bootstrap popover is not working with javascript?
- c# - Sometimes combobox close dropdown list
- java - How to get ID created from Oracle trigger in MyBatis - Spring Boot
- json - 颤振:未找到 fromJson 和 parsedJson 方法,尽管导入'dart:convert';
- sql-server - How to make a JPA sequence generate sequence Id in sync with external system using same DB concurrently
- python - Read output from subprocess cli, yowsup-cli to store the output
- c# - Create random string that can be used as query in a link
- html - panelGrid 边框不想被隐藏
- jena - How can i get the Fuseki API via SPARQLWrapper to properly report a detailed error message?
- antd - Ant Design Upload full parent width