R语言树状图添加坐标轴标签及调整X轴范围问题求助
解决树状图轴标签和X轴范围问题
问题1:添加X/Y轴标签无效的解决方法
使用dendextend绘制水平树状图(horiz=TRUE)时,直接在plot()中设置xlab和ylab参数常不生效,这是函数对水平布局的轴标签处理逻辑导致的。可通过以下两种方式解决:
方法1:手动添加轴标签
在plot()之后用mtext()函数添加标签,同时调整边距给标签留出空间:
par(mar = c(5,5,3,7)) # 增大下、左边距,适配轴标签 plot(dend, horiz = TRUE, nodePar = list(cex = .007)) mtext("欧氏距离", side = 1, line = 3, cex = 1) # side=1对应X轴 mtext("OTUs", side = 2, line = 3, cex = 1) # side=2对应Y轴
方法2:使用dendextend的add_axis()函数
贴合dendextend工作流的方式,先关闭默认轴再添加自定义标签:
par(mar = c(5,5,3,7)) plot(dend, horiz = TRUE, nodePar = list(cex = .007), axes = FALSE) add_axis(dend, side = 1, text = "欧氏距离", line = 3) add_axis(dend, side = 2, text = "OTUs", line = 3)
问题2:设置X轴范围导致树反转、标签混乱的解决方法
水平树状图默认X轴方向是从右到左(距离值从大到小),若直接设置xlim=c(0,70)会强制轴方向反转,导致树结构和标签错位。正确做法是将X轴范围设为从大到小:
plot(dend, horiz = TRUE, nodePar = list(cex = .007), xlim = c(70, 0))
如果需要X轴显示从左到右的顺序(0到70),同时保持树结构和标签正常,需先反转树的方向:
dend_reversed <- rev(dend) plot(dend_reversed, horiz = TRUE, nodePar = list(cex = .007), xlim = c(0, 70)) # 后续添加轴标签步骤同上
完整修改后的代码
结合两种解决方案的完整代码如下:
library(colorspace) library(dendextend) data <- read.csv("test.csv") data2 <- data[, -1] site_labels <- as.factor(data[, 1]) sites_col <- rev(rainbow_hcl(12))[as.numeric(site_labels)] d <- dist(data2) hc <- hclust(d, method = "average") dend <- as.dendrogram(hc) dend <- color_branches(dend, k=3) labels_colors(dend) <- rainbow_hcl(12)[sort_levels_values( as.numeric(data[, 1])[order.dendrogram(dend)] )] labels(dend) <- paste(as.character(data[, 1])[order.dendrogram(dend)], " (",labels(dend),")", sep = "") dend <- set(dend, "labels_cex", 0.5) dend <- set(dend, "branches_lwd", 3) # 调整边距+设置正确X轴范围+添加轴标签 par(mar = c(5,5,3,7)) plot(dend, horiz = TRUE, nodePar = list(cex = .007), xlim = c(70, 0)) mtext("欧氏距离", side = 1, line = 3, cex = 1) mtext("OTUs", side = 2, line = 3, cex = 1)
内容的提问来源于stack exchange,提问作者maurobio
相关产品推荐
相关产品推荐

