You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除ggplot2树状图图例中的灰色多余条目?

解决ggdendro+ggplot2树状图图例多余灰色条目的问题

多余灰色图例条目通常源于聚类分组数据中存在NA值,或者颜色映射的levels包含未实际使用的类别。以下是针对性的解决方法:

核心思路

  1. 确保聚类分组变量仅包含目标聚类类别(无NA或多余值)
  2. 精准控制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 16:40:20