R语言Plotly绘图图例重复问题求助
解决Plotly散点图图例重复问题
你的代码出现图例重复的原因很明确:第一次调用plot_ly()时,已经通过color = ~color参数生成了对应"big"和"small"的两组图例项;后续调用add_trace()又新增了一组轨迹,并且设置showlegend = TRUE,等于把图例又重复渲染了一次。
这里给你两种可行的解决方法:
方法一:关闭新增轨迹的图例显示
直接在add_trace()里把showlegend设为FALSE,因为你添加这个trace的目的只是自定义hover提示文本,不需要它生成新图例:
library(plotly) myFun <- function(n = 5000) { a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE)) paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE)) } file = data.frame(var1 = rnorm(100,100,100), var2 = rnorm(100,100,100) , var4 = myFun(100)) file$ratio = file$var1/file$var2 file[is.na(file)] <- 0 file$color = ifelse(file$ratio < median(file$ratio), "big", "small") pal <- c("red", "blue") pal<- setNames(pal, c("big", "small")) p = plot_ly(file, x = ~log(var1), y = ~var2, text = ~paste("name:", var4), color = ~color, colors = pal, type = "scatter") p = p %>% layout(title = 'title1', xaxis = list(title = 'title2'), yaxis = list(title = 'title3')) # 修改这里:将showlegend设为FALSE p =p %>% add_trace( text = paste("name :", file$var4, "<br> var1_val :", file$var1, "<br> var2_val:", file$var2, "<br> Ratio :", file$ratio), hoverinfo = "text", showlegend = FALSE)
方法二:整合hover文本到初始调用(更简洁)
其实不需要额外调用add_trace(),直接在第一次plot_ly()里定义好hover文本即可,这样从根源避免重复图例:
library(plotly) myFun <- function(n = 5000) { a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE)) paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE)) } file = data.frame(var1 = rnorm(100,100,100), var2 = rnorm(100,100,100) , var4 = myFun(100)) file$ratio = file$var1/file$var2 file[is.na(file)] <- 0 file$color = ifelse(file$ratio < median(file$ratio), "big", "small") pal <- c("red", "blue") pal<- setNames(pal, c("big", "small")) # 直接在plot_ly里定义hover文本和hoverinfo,无需后续add_trace p = plot_ly(file, x = ~log(var1), y = ~var2, text = ~paste("name :", var4, "<br> var1_val :", var1, "<br> var2_val:", var2, "<br> Ratio :", ratio), hoverinfo = "text", color = ~color, colors = pal, type = "scatter") p = p %>% layout(title = 'title1', xaxis = list(title = 'title2'), yaxis = list(title = 'title3'))
两种方法都能解决图例重复的问题,方法二更推荐,因为代码更简洁,逻辑也更清晰。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

