使用ggplotly转换factoextra的PCA绘图时图例分组重复如何解决
问题复现
依赖包加载及初始绘图代码如下,直接绘图不会出现图例重复问题:
library(FactoMineR) library(dplyr) library(factoextra) library(plotly) pca1 <- PCA(iris[,1:4]) # 生成按物种分组的PCA个体散点图 fpi <- fviz_pca_ind(pca1, habillage = iris$Species) fpi

使用ggplotly()转换上述ggplot对象后,图例中的分组会重复出现两次:
ggplotly(fpi)

问题原因
fviz_pca_ind()设置分组参数habillage时,会默认同时将color和shape两个美学属性映射到分组变量,ggplotly转换时会为两个映射各自生成独立图例,最终出现重复。
解决方案
方法1:固定散点形状,仅保留颜色映射
生成绘图对象时指定固定的散点形状,不再将形状映射到分组,仅保留颜色分组,转换后仅生成一个图例:
# 指定shape.ind为固定值,不随分组变化 fpi <- fviz_pca_ind(pca1, habillage = iris$Species, shape.ind = 19) ggplotly(fpi)
方法2:合并ggplot层面的图例
如果需要保留不同分组的不同散点形状,可在ggplot层面统一颜色和形状的图例名称,转换时会自动合并为单个图例:
fpi <- fviz_pca_ind(pca1, habillage = iris$Species) + # 统一两个图例的名称,触发自动合并 guides(color = guide_legend("物种"), shape = guide_legend("物种")) ggplotly(fpi)
方法3:转换后手动隐藏重复图例
无需修改原始ggplot对象,转换后直接隐藏其中一组重复的图例项即可:
ggplotly(fpi) %>% # 隐藏前3个对应形状映射的图例项(分组数为3时) style(showlegend = FALSE, traces = 1:3)
内容的提问来源于stack exchange,提问作者Masoud
相关产品推荐
相关产品推荐

