如何在R语言circlize_dendrogram中仅显示选定标签
解决dendextend圆形树状图仅显示指定标签的问题
问题场景
使用dendextend包绘制矩形树状图时,通过将非目标标签设为空白字符串,可实现仅显示以Merc开头的标签。但切换到circlize_dendrogram绘制圆形树状图时,会触发以下警告:
Not all labels are unique. Therefore, we pad the labels with a running number, so to be able to produce the plot.
此时非目标标签会被自动添加序号显示,无法达到隐藏效果。
问题原因
circlize_dendrogram对标签的唯一性有严格要求,大量重复的空白标签会触发内部的标签补全逻辑,导致原本要隐藏的标签被带序号的内容替代。
解决方案
无需修改标签内容,而是通过控制标签的显示大小(labels_cex)来隐藏非目标标签:
- 保留所有原始标签以保证唯一性
- 将非
Merc开头的标签的cex设为0(完全不显示) - 目标标签的
cex保持需要的大小
修改后的完整代码
1. 初始数据处理
library(dplyr) library(dendextend) mtcars %>% select(mpg, cyl, disp, drat, hp, carb) %>% dist() %>% hclust() %>% as.dendrogram() -> dend
2. 矩形树状图(原逻辑可保留)
leafcols <- as.numeric(mtcars[, "am"]) leafcols <- leafcols[order.dendrogram(dend)] leafcols[leafcols == 1] <- "darkred" leafcols[leafcols == 0] <- "darkblue" new_labels <- dend %>% labels new_labels[!grepl("^Merc", new_labels)] <- "" dend %>% set("leaves_pch", 19) %>% set("leaves_cex", 2) %>% set("leaves_col", leafcols) %>% set("labels", new_labels) %>% plot(type = "rectangle")
3. 圆形树状图(修复版本)
leafcols <- as.numeric(mtcars[, "am"]) leafcols <- leafcols[order.dendrogram(dend)] leafcols[leafcols == 1] <- "darkred" leafcols[leafcols == 0] <- "darkblue" # 定义标签显示大小:Merc开头的标签设为2,其余设为0 label_cex <- ifelse(grepl("^Merc", labels(dend)), 2, 0) dend %>% set("leaves_pch", 19) %>% set("leaves_cex", 2) %>% set("leaves_col", leafcols) %>% set("labels_cex", label_cex) %>% # 设置标签显示大小 circlize_dendrogram(dend_track_height = 0.8)
说明
- 该方案保留了所有原始标签的唯一性,避免了警告触发
- 通过
labels_cex = 0实现非目标标签的完全隐藏,效果与设置空白标签一致 - 同时保留了叶子节点的点样式、大小和颜色设置,不影响其他可视化效果
内容的提问来源于stack exchange,提问作者Crops
相关产品推荐
相关产品推荐

