如何在R的pvclust树状图中将叶标签改为水平显示?
解决pvclust聚类树状图叶标签水平显示的问题
我之前做Bootstrap层次聚类的时候也碰到过这个需求,plot.hclust确实没直接设置叶标签方向的参数,但有几个简单的办法能搞定,同时还能保留你需要的自定义标题和节点p值:
方法1:用dendextend包(推荐,更灵活)
这个包专门用来处理树状图的各种自定义需求,操作起来很直观:
- 先加载需要的包:
library(pvclust) library(dendextend)
- 运行你的pvclust聚类(这里用示例数据,你替换成自己的数据集就行):
# 示例数据,替换为你的真实数据 data <- mtcars[, 1:5] result <- pvclust(data, method.hclust = "ward.D2", method.dist = "euclidean")
- 把hclust对象转成dendrogram,设置叶标签为水平(0度),还可以调整标签大小:
dend <- as.dendrogram(result$hclust) # 设置叶标签水平(0度,默认是90度垂直),同时调整字体大小 dend <- dend %>% set("labels_angle", 0) %>% set("labels_cex", 0.8)
- 绘制树状图,添加自定义标题,然后叠加pvclust的节点p值:
plot(dend, main = "我的Bootstrap层次聚类结果", horiz = FALSE) # 添加节点的au和bp p值,digits控制小数位数 text.pvclust(result, digits = 2, cex = 0.7)
方法2:不用额外包,手动调整叶标签
如果不想装新包,也可以用基础绘图函数手动添加水平标签:
- 先绘制hclust树状图,但不显示默认的叶标签:
plot(result$hclust, main = "我的Bootstrap层次聚类结果", labels = FALSE)
- 手动添加水平叶标签,调整位置避免和树重叠:
# 获取叶节点的x坐标和对应标签 leaf_x <- result$hclust$order leaf_labels <- rownames(data)[leaf_x] # 添加水平标签,srt=0表示水平,y值根据你的树高调整(这里用-0.5,可按需修改) text(x = leaf_x, y = rep(-0.5, length(leaf_x)), labels = leaf_labels, srt = 0, cex = 0.8, adj = c(0.5, 1))
- 同样叠加节点p值:
text.pvclust(result, digits = 2, cex = 0.7)
两种方法都能实现你要的效果,dendextend的方式更适合后续做更多树状图的自定义(比如颜色分支、高亮分组等),基础方法则更轻量化。
内容的提问来源于stack exchange,提问作者JSneathThompson
相关产品推荐
相关产品推荐

