如何在R中横向绘制保留信息的pvclust聚类树状图?
解决pvclust横向树状图保留所有信息的方法
pvclust自带的绘图函数不支持直接通过horiz=T生成横向树状图,且转换为普通dendrogram会丢失au、bp等专属标注。以下两种方法可实现需求:
方法1:基础绘图系统旋转实现
先绘制纵向树状图(保留所有标注),再通过旋转坐标系转为横向,同时调整文字位置避免重叠:
# 假设你的pvclust结果对象为pv plot(pv, ylim=c(0, 0.004)) # 先绘制带所有标注的纵向图 # 旋转绘图坐标系 par(usr = c(par("usr")[3:4], par("usr")[1:2])) # 重新绘制树状图,隐藏原坐标轴和边框 plot(pv, ylim=c(0, 0.004), axes=FALSE, frame.plot=FALSE) axis(1) # 添加对应原height的x轴 # 调整au/bp标签的显示角度 text_idx <- which(names(pv$edges) == "label") for (i in text_idx) { text(pv$edges$x[i], pv$edges$y[i], pv$edges$label[i], srt=90, adj=c(0, 0.5)) }
方法2:ggdendro+ggplot2实现(更灵活稳定)
通过提取pvclust的完整数据,用ggplot2绘制可自定义的横向树状图,完美保留所有信息:
# 安装并加载依赖包 install.packages(c("ggdendro", "ggplot2")) library(ggdendro) library(ggplot2) # 提取树状图结构数据 dend_data <- dendro_data(pv, type="rectangle") # 提取pvclust专属的au/bp标注信息 label_data <- pv$edges[pv$edges$label != "", c("x", "y", "label")] # 转换坐标适配横向布局 label_data$x_new <- label_data$y label_data$y_new <- label_data$x # 绘制横向树状图 ggplot() + geom_segment(data=segment(dend_data), aes(x=y, y=x, xend=yend, yend=xend)) + geom_text(data=label(dend_data), aes(x=y, y=x, label=label), hjust=1, size=3) + geom_text(data=label_data, aes(x=x_new, y=y_new, label=label), hjust=0, size=2.5) + coord_flip() + scale_y_continuous(name="Height") + theme_minimal() + theme(axis.text.y=element_blank(), axis.ticks.y=element_blank())
内容的提问来源于stack exchange,提问作者CM2
相关产品推荐
相关产品推荐

