使用 Plotly 的突出显示功能和 ggplotly 控制图例行为

fro*_*oam 6 r ggplot2 plotly ggplotly

我花了很多时间试图弄清楚在highlight()结合使用 Plotly 的功能时如何自定义或控制 Plotly 的图例行为plotly::ggplotly()。这是一个例子:

library(ggplot2)
library(plotly)
library(dplyr)

test_data <- data.frame( 
  name = LETTERS[1:5], 
  metric = sample(x = c(500:800), size = 100)
  ) %>% 
  arrange(name) %>% 
  group_by(name) %>% 
  mutate(index = row_number()) %>% 
  data.frame()


plotly_obj <- ggplotly(
  test_data %>% 
    highlight_key(~name) %>% 
    ggplot() + 
    geom_line(
      aes(
        x = index, 
        y = metric, 
        color = name
        ), 
      size = .75
      ) + 
    scale_x_continuous(breaks = c(1:20)) +
    scale_color_brewer(palette = "Accent") + 
    theme_bw()
  )

highlight(
  plotly_obj, 
  on = "plotly_hover",
  off = "plotly_doubleclick",
  opacityDim = .1
  ) %>% 
  config(displayModeBar = F)
Run Code Online (Sandbox Code Playgroud)

这会生成一个非常接近我正在寻找的图表,但是,图例通过添加图例中突出显示的组的第二个实例来对悬停突出显示做出反应:

图1

我找到了一种通过在上面的函数内部highlight添加(该行之后)来完全禁用图例行为的方法,这会产生以下结果:selected = attrs_selected(showlegend = FALSE)opacityDim = .1

图2

有没有办法强制图例突出显示当前通过将鼠标悬停在图例内选择的组/行,而不是 1.) 在图例中创建重复的突出显示项目,如第一个图表或 2.) 完全禁用中的图例第二张图表?我绝不是 Plotly 的专家,我有一种感觉,我的问题可能是由于我对 Plotly 的串扰机制的无知,并且可能不理解如何将ggplotly功能传递aes()给图例。然而,我对 JavaScript 知之甚少,而且我还没有找到一种方法来强制图例以这种方式运行。如果我遗漏了什么,请告诉我。