如何修改fviz_silhouette图例?解决重复显示自定义标签问题
解决fviz_silhouette图例重复显示的问题
我懂你遇到的麻烦了——fviz_silhouette默认会把聚类的原始编号(1、2、3)作为图例显示,而你直接加scale_fill_discrete(labels=c("a","b","c"))只是额外添了一组自定义标签,自然就出现了重复。下面给你两种实用的解决办法:
方法1:提前替换聚类标签
在生成silhouette对象前,先把聚类结果的编号替换成你想要的自定义标签,这样后续可视化时就会直接用新标签,不会有重复:
library(factoextra) library(cluster) set.seed(123) data("iris") iris.scaled <- scale(iris[, -5]) # K-means聚类 km.res <- kmeans(iris.scaled, 3, nstart = 2) # 将聚类编号转为因子并替换自定义标签 cluster_labels <- factor(km.res$cluster, levels = c(1,2,3), labels = c("a","b","c")) # 用替换后的标签生成silhouette对象 sil <- silhouette(cluster_labels, dist(iris.scaled)) # 可视化,此时图例直接显示自定义标签 fviz_silhouette(sil)
方法2:在可视化时精准覆盖图例
如果不想改动原始聚类结果,可以在scale_fill_discrete里指定breaks参数对应原始聚类编号,同时设置labels为自定义标签,这样就能覆盖默认图例,而非新增:
library(factoextra) library(cluster) set.seed(123) data("iris") iris.scaled <- scale(iris[, -5]) # K-means聚类 km.res <- kmeans(iris.scaled, 3, nstart = 2) # 生成silhouette对象 sil <- silhouette(km.res$cluster, dist(iris.scaled)) # 指定breaks匹配原始聚类编号,用labels替换为自定义标签 fviz_silhouette(sil) + scale_fill_discrete(breaks = c(1,2,3), labels = c("a","b","c"))
两种方法都能解决重复问题,你可以按需选择:第一种从源头修改了聚类标签,更彻底;第二种则是在可视化层面对图例做覆盖调整。
内容的提问来源于stack exchange,提问作者Fabrizio




