You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修改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

火山引擎 最新活动