ggplotly()转换ggplot图表时图例显示异常该如何解决?
ggplotly转换ggplot图例异常修复方案
问题表现
- 原生ggplot渲染的图表图例显示正常,经
ggplotly()转换后图例出现非预期改动,常规图例修改方案无法修复 - 已尝试修改
g1$data$ind中的标签参数,未解决问题
效果对比
- ggplot原生渲染效果:

- ggplotly转换后异常效果:

问题复现代码
library(fitdistrplus) set.seed(123) X <- rpois(20,3) fit.p.mme <- fitdist(data = X, distr = "pois", method = "mme") fit.p.mle <- fitdist(data = X, distr = "pois", method = "mle") g1 <- cdfcomp(list(fit.p.mme, fit.p.mle), addlegend = TRUE, legendtext = c("P MME", "P MLE"), plotstyle = "ggplot") g1 <- g1 + theme_gray() g1 g1 %>% ggplotly()
修复方案
问题根源是fitdistrplus包的cdfcomp生成的ggplot对象使用了非标准的美学映射,ggplotly转换时无法正确识别图层和图例的对应关系,会把每个图层拆成独立的图例项,导致错乱。可选择以下两种方式修复:
方案1:手动重绘ggplot图层(推荐,适配性最好)
先提取cdfcomp生成的绘图数据,用原生ggplot语法手动映射美学属性,从根源避免非标准映射导致的转换错误,再转ggplotly就不会出现图例异常:
# 提取已生成ggplot的所有图层数据 build_data <- ggplot2::ggplot_build(g1)$data g1_fixed <- ggplot() + # 绘制MME对应的CDF线和点 geom_step(aes(x = build_data[[1]]$x, y = build_data[[1]]$y, color = "P MME"), linewidth = 1) + geom_point(aes(x = build_data[[3]]$x, y = build_data[[3]]$y, color = "P MME"), size = 2) + # 绘制MLE对应的CDF线和点 geom_step(aes(x = build_data[[2]]$x, y = build_data[[2]]$y, color = "P MLE"), linewidth = 1) + geom_point(aes(x = build_data[[4]]$x, y = build_data[[4]]$y, color = "P MLE"), size = 2) + labs(x = "x", y = "CDF", color = NULL) + theme_gray() # 转换后图例正常 g1_fixed %>% ggplotly()
方案2:直接修改plotly对象的图例属性
如果不想重绘图表,可以在ggplotly生成对象后,逐个修改每个图层trace的名称、分组属性,把属于同一系列的图层归到同一图例组下:
library(plotly) p <- g1 %>% ggplotly() # 调整第一个系列(P MME)的线图层属性 p$x$data[[1]]$name <- "P MME" p$x$data[[1]]$legendgroup <- "P MME" # 调整第二个系列(P MLE)的线图层属性 p$x$data[[2]]$name <- "P MLE" p$x$data[[2]]$legendgroup <- "P MLE" # 把两个点图层归到对应分组,不重复显示图例 p$x$data[[3]]$name <- "P MME" p$x$data[[3]]$legendgroup <- "P MME" p$x$data[[3]]$showlegend <- FALSE p$x$data[[4]]$name <- "P MLE" p$x$data[[4]]$legendgroup <- "P MLE" p$x$data[[4]]$showlegend <- FALSE # 输出调整后的图表 p
说明:直接修改g1$data$ind标签不生效的原因是,ggplotly不会完全沿用ggplot对象的内部数据标签生成图例,而是按图层拆分trace独立生成图例项,因此只修改ggplot对象的数据标签无法影响转换后的plotly图例。
内容的提问来源于stack exchange,提问作者yeahman269
相关产品推荐
相关产品推荐

