Shiny中Crosstalk联动Plotly条形图点击仅半条高亮问题求解
问题原因
该半高亮异常是Plotly与Crosstalk联动时的默认样式适配问题导致:
- Plotly条形图默认包含填充色、描边两层渲染样式,Crosstalk的
highlight功能默认仅修改填充色的透明度,未同步调整描边的透明度属性,两种样式叠加后就会出现选中条形仅部分区域高亮的视觉效果。 - Plotly自带的点击选中交互效果和Crosstalk的高亮效果叠加,也会进一步加重显示异常。
修复方案
在highlight函数中显式指定选中、未选中状态的完整marker样式,同步控制填充和描边的透明度即可解决问题,修改后的代码如下:
library(shiny) library(crosstalk) library(plotly) require(dplyr) df <- tibble(names = LETTERS[1:5], x = runif(5,10,20), y = runif(5,50,100)) ui <- fluidPage( fluidRow( column(4, plotlyOutput("outp1")), column(4, plotlyOutput("outp2")) ) ) server <- function(input, output, session) { hd <- highlight_key(df, ~names) output$outp1 <- renderPlotly({ plot_ly( hd, x = ~names, y = ~x, type = "bar", source = "p1" ) %>% highlight( on = "plotly_click", off = "plotly_doubleclick", # 统一未选中元素的透明度,填充和描边同步降低 opacityDim = 0.2, # 显式指定选中元素的完整样式,填充和描边均保持完全不透明 selected = attrs_selected( marker = list( opacity = 1, line = list(opacity = 1) ) ) ) }) output$outp2 <- renderPlotly({ plot_ly( hd, x = ~names, y = ~y, type = "bar", source = "p2" ) %>% highlight( on = "plotly_click", off = "plotly_doubleclick", opacityDim = 0.2, selected = attrs_selected( marker = list( opacity = 1, line = list(opacity = 1) ) ) ) }) } shinyApp(ui, server)
如果仍存在显示异常,可在plot_ly的参数中显式定义条形的描边样式,覆盖默认渲染规则:
plot_ly( hd, x = ~names, y = ~x, type = "bar", source = "p1", # 统一设置条形描边样式,避免默认样式干扰 marker = list(line = list(width = 1, color = "#ffffff")) )
内容的提问来源于stack exchange,提问作者sedsiv
相关产品推荐
相关产品推荐

