将带facet_wrap的ggplot转换为plotly时如何避免图例重复
ggplot转plotly后图例重复问题解决方案
出现该问题的核心原因是ggplotly转换时会为每个分面内的每个图形元素单独生成一条迹(trace),相同manufacturer分类在不同分面下的迹会被默认识别为独立的图例条目,最终导致图例重复。
我们可以通过修改plotly对象的迹属性,将同个分类的所有迹绑定到同一个图例组,仅保留第一个同分类条目的图例显示即可,可复现的修改代码如下:
library(plotly) library(ggplot2) library(dplyr) p <- mpg %>% ggplot(aes(year)) + geom_ribbon(aes(ymin=cty, ymax=hwy, fill = manufacturer), alpha=0.2) + geom_line(aes(y = hwy, col=manufacturer)) + facet_wrap(~class) # 转换为plotly对象后调整图例配置 ply <- ggplotly(p) # 统一相同manufacturer的图例组,仅保留第一个同组条目的显示 for (i in seq_along(ply$x$data)) { # 提取当前迹的名称,也就是manufacturer的值 trace_name <- ply$x$data[[i]]$name # 给同名称的迹设置相同的legendgroup ply$x$data[[i]]$legendgroup <- trace_name # 只保留第一个出现的同名称迹的图例显示,其余隐藏 if (i > 1 && any(sapply(ply$x$data[1:(i-1)], function(x) x$name == trace_name))) { ply$x$data[[i]]$showlegend <- FALSE } } # 查看调整后的效果 ply
执行上述代码后生成的plotly图表,图例将与ggplot原生效果完全一致,每个manufacturer仅显示一个图例条目,点击图例可同步控制所有分面内对应分类的填充区域和折线的显隐。
内容的提问来源于stack exchange,提问作者cboettig
相关产品推荐
相关产品推荐

