如何移除ggplot2树状图图例中的灰色多余条目?
解决ggdendro+ggplot2树状图图例多余灰色条目的问题
多余灰色图例条目通常源于聚类分组数据中存在NA值,或者颜色映射的levels包含未实际使用的类别。以下是针对性的解决方法:
核心思路
- 确保聚类分组变量仅包含目标聚类类别(无NA或多余值)
- 精准控制
scale_colour_manual的参数,配合图例配置过滤多余条目
完整代码示例
library(ggplot2) library(ggdendro) library(cluster) # 1. 准备数据与聚类 set.seed(123) iris_scaled <- scale(iris[,1:4]) hc <- hclust(dist(iris_scaled)) # 分成3类 clusters <- cutree(hc, k = 3) # 2. 提取树状图数据并关联聚类分组 dend_data <- dendro_data(hc, type = "rectangle") leaf_data <- label(dend_data) # 匹配样本与聚类分组,确保无NA(这里用match精准匹配) leaf_data$cluster <- factor(clusters[match(leaf_data$label, rownames(iris_scaled))]) # 3. 绘制树状图并修复图例 ggplot() + # 绘制树状图分支 geom_segment(data = segment(dend_data), aes(x = x, y = y, xend = xend, yend = yend)) + # 绘制带聚类颜色的标签 geom_text(data = leaf_data, aes(x = x, y = y, label = label, colour = cluster), hjust = 0, size = 3) + coord_flip() + theme_dendro() + # 手动指定颜色与显示的聚类条目 scale_colour_manual( breaks = levels(leaf_data$cluster), # 仅显示聚类的类别 values = c("#E64B35FF", "#4DBBD5FF", "#00A087FF"), # 自定义聚类颜色 na.value = "transparent" # 若存在NA,设置为透明不显示 ) + # 强制图例仅展示指定条目(避免自动生成多余项) guides(colour = guide_legend(override.aes = list(colour = c("#E64B35FF", "#4DBBD5FF", "#00A087FF"))))
关键细节说明
- 过滤NA值:如果
leaf_data$cluster存在NA,优先通过leaf_data <- leaf_data[!is.na(leaf_data$cluster),]过滤,从源头上避免多余图例条目。 - 因子化分组变量:将聚类分组转为因子,确保
levels仅包含实际的聚类类别(如1、2、3),避免自动生成额外的levels。 breaks与guides配合:breaks指定图例要显示的类别,guide_legend(override.aes)强制图例仅展示对应颜色,彻底消除灰色条目。
内容的提问来源于stack exchange,提问作者Excelsior
相关产品推荐
相关产品推荐

