如何为fviz_dend绘制的树状图添加聚类编号相关图例
如何为fviz_dend绘制的树状图添加聚类编号相关图例
嘿,我看你在用fviz_dend绘制树状图时遇到了图例不显示的问题——明明写了guides和scale_fill_manual相关代码,却既看不到图例也没报错,确实有点让人困惑。咱们来拆解一下问题,并且给你一个可行的解决方案。
问题根源
fviz_dend里的rect_fill = TRUE是内部处理聚类矩形填充的,它并没有把fill这个美学映射暴露给ggplot的图例系统,所以你后续添加的scale_fill_manual和guides根本找不到对应的映射对象,自然就不会生成图例了。
解决方法:手动映射矩形填充的美学属性
我们可以先关闭fviz_dend自带的矩形填充,然后手动提取树状图生成的矩形数据,用geom_rect重新绘制,这样就能让ggplot识别到fill映射,进而生成我们想要的图例。具体步骤如下:
- 先确保你加载了必要的包:
library(factoextra) library(ggplot2) library(ggnewscale) # 用来避免和原图层的颜色映射冲突
- 修改你的代码,重新构建树状图并添加图例:
# 绘制基础树状图,关闭自带的矩形填充 dend <- fviz_dend(hc1, k = 3, k_colors = "aaas", color_labels_by_k = TRUE, rect = TRUE, rect_border = "aaas", rect_fill = FALSE, # 先禁用内部填充 horiz = TRUE, cex = 0.8, lwd = 1) + labs(title = "") + theme(panel.background = element_rect(colour = "black"), axis.text.y = element_text(colour="black", size = 10, face = "bold"), axis.text.x = element_text(colour="black", size = 10, face = "bold"), axis.ticks = element_line(colour = "black"), axis.ticks.y = element_line(colour = "black"), panel.grid.minor = element_line()) # 手动添加带图例的聚类矩形填充 dend <- dend + new_scale_fill() + # 新建一个fill比例尺,避免和原标签颜色冲突 geom_rect( data = attr(dend$data, "rect"), # 提取fviz_dend生成的聚类矩形数据 aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = cluster), alpha = 0.3 # 调整填充透明度,避免遮挡树状图线条 ) + # 手动指定聚类颜色和标签 scale_fill_manual( values = c("1" = "blue", "2" = "darkgreen", "3" = "red"), labels = c("I", "II", "III") ) + # 设置图例标题 guides(fill = guide_legend(title = "Cluster #"))
小提示
- 要确保
hc1是合法的层次聚类对象(比如hclust()函数的输出结果) k = 3的聚类数量要和你scale_fill_manual里指定的颜色数量对应上,不然会出现颜色缺失的问题- 调整
alpha参数可以让填充矩形不遮挡树状图的线条和标签,提升可读性
备注:内容来源于stack exchange,提问作者Ikram Bashir
相关产品推荐
相关产品推荐

