我想使用dendextend包创建一棵树状图。它可以创建美观的gg树状图,但是当你把它变成“圆形”时,标签就无法跟上。下面提供一个示例。
我的距离对象在这里:http://speedy.sh/JRVBS/mydist.RDS
library(dendextend)
library(ggplot2)
#library(devtools) ; install_github('kassambara/factoextra')
library(factoextra)
clus <- hcut(mydist, k = 6, hc_func = 'hclust',
hc_method = 'ward.D2', graph = FALSE, isdiss = TRUE)
dend <- as.dendrogram(clus)
labels(dend) <- paste0(paste0(rep(' ', 3), collapse = ''), labels(dend))
dend <- sort(dend, decreasing = FALSE)
ggd1 <- ggplot(dend %>%
set('branches_k_color', k = 6) %>%
set('branches_lwd', 0.6) %>%
set('labels_colors', k = 6) %>%
set('labels_cex', 0.6),
theme = theme_minimal(),
horiz = TRUE)
ggd1 <- ggd1 + theme(panel.grid.major = element_blank(),
axis.text = element_blank(),
axis.title = element_blank())
ggd1 <- ggd1 + ylim(max(get_branches_heights(dend)), -3)
这基本上给了我这张图片:
![enter image description here](https://istack.dev59.com/ZbiNj.webp)
ggd1 + coord_polar(theta = 'x')
我得到了下面的图表,这非常接近我想要的,但我需要旋转标签。
![enter image description here](https://istack.dev59.com/nwhW1.webp)
geom_segment()
和geom_text()
对它们进行重心图和标签的创建。我相信我可以通过以下方式公开相关的数据框:back.df1 <- dendextend::as.ggdend(dend)
back.df2 <- dendextend::prepare.ggdend(back.df1)
另一个策略可能是在绘图时使用
ggplot(labels = FALSE...)
,然后以某种方式手动添加geom_text()
,以保留颜色但允许使用geom_text(angle = )
。我还怀疑各种ggplot巫术的组合可以让我重新创建第一和第二个图,但也控制标签的角度。然而,我不知道如何做到这一点,已经使用dendextend软件包构建了很多内容,理想情况下希望避免使用任何新的软件包来创建树状图对象,因为我真的很喜欢这个标签之外的功能!解决方案: 我基于Richard Telford的解决方案创建了编辑后的
ggplot.ggdend()
版本。这与下面答案中提供的版本相同。接下来,我创建了一个函数自动创建角度和hjust向量,以使标签旋转从6点钟到12点钟,以提高可读性。createAngleHJustCols <- function(labeldf) {
nn <- length(labeldf$y)
halfn <- floor(nn/2)
firsthalf <- rev(90 + seq(0,360, length.out = nn))
secondhalf <- rev(-90 + seq(0,360, length.out = nn))
angle <- numeric(nn)
angle[1:halfn] <- firsthalf[1:halfn]
angle[(halfn+1):nn] <- secondhalf[(halfn+1):nn]
hjust <- numeric(nn)
hjust[1:halfn] <- 0
hjust[(halfn+1):nn] <- 1
return(list(angle = angle, hjust = hjust))
}
然后我使用以下代码生成了这个图:
gdend <- dendextend::as.ggdend(dend %>%
set('branches_k_color', k = 6) %>%
set('branches_lwd', 0.6) %>%
set('labels_colors', k = 6) %>%
set('labels_cex', 0.6))
gdend$labels$angle <- ifelse(horiz, 0, 90)
gdend$labels$hjust <- 0
gdend$labels$vjust <- 0.5
# if polar, change the angle and hjust so that the labels rotate
if(polarplot) {
newvalues <- createAngleHJustCols(gdend$labels)
gdend$labels$angle <- newvalues[['angle']]
gdend$labels$hjust <- newvalues[['hjust']]
}
ggresult <- newggplot.ggdend(gdend, horiz = TRUE, offset_labels = -2)
ggresult <- ggresult + ggtitle(plottitle)
ggresult <- ggresult + theme(plot.margin = margin(c(2,2,2,2),
axis.text = element_blank(),
plot.title = element_text(margin = margin(10,2,2,2)))
ggresult <- ggresult + ylim(max(get_branches_heights(dend)), -5)
ggresult <- ggresult + coord_polar(theta = 'x', direction = 1)
(我更改了一些数据,因此在图表中可能会出现一些不同的顺序)
load("mydist.RDS") Error: bad restore file magic number (file may be corrupted) -- no data loaded
。最好使用dput
并将其包含在你的问题中(除非对象很大)。 - Richard Telford