You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Plotly R 柱状图点击高亮仅显示部分区域问题求助

问题描述

我想为绘制的Plotly R柱状图添加点击高亮选中柱条的功能,但实际测试时发现,点击柱条后仅能高亮其部分区域。我已尝试查找相关方案修复,仍未解决问题,恳请各位提供解决思路。

使用的代码

number_of_debates_from_1803_1910 <- fread("~/projects/hansard-shiny/app-data/introduction/number_of_debates_from_1803_1910.csv")
  
  number_of_debates_from_1803_1910 %>%
    highlight_key() %>%
    plot_ly(
          x = ~decade, 
          y = ~no_of_debates, 
          type = 'bar', 
          text = ~paste0("Decade: ", "<b>", decade, "</b>", "\n",
                         "Number of Debates: ", "<b>", no_of_debates, "</b>", "\n"),
          hoverinfo = "text",
          marker = list(color = 'rgb(158,202,225)',
                        line = list(color = 'rgb(8,48,107)',
                                    width = 1.5))) %>% 
    highlight(on = "plotly_click", off = "plotly_doubleclick") %>%
    layout(barmode = "overlay"),
           xaxis = list(title = ""),
           yaxis = list(title = "")) %>%
    config(displayModeBar = F) 

数据集信息

原始csv内容

decade,no_of_debates
1800,926
1810,2435
1820,2400
1830,7848
1840,7398
1850,8835
1860,10660
1870,14051
1880,31509
1890,31857
1900,49725
1910,5631

直接生成数据集的代码

structure(list(decade = c(1800L, 1810L, 1820L, 1830L, 1840L,  1850L), no_of_debates = c(926L, 2435L, 2400L, 7848L, 7398L, 8835L )), row.names = c(NA, -6L), class = c("data.table", "data.frame" ))

效果截图

  • 点击柱条前的图表效果图:
    点击前效果图
  • 点击柱条后的异常高亮效果图:
    点击后异常效果图

解决方案

该问题的核心诱因有两个:

  • 调用highlight_key()时未显式指定分组字段,Plotly默认匹配逻辑和柱状图渲染逻辑冲突
  • 单组柱状图不需要配置barmode = "overlay",该参数为多系列柱状图叠加场景使用,会导致选中样式仅作用于部分图层,同时原代码还存在layout括号书写错误的问题

修正后可直接运行的代码

library(data.table)
library(plotly)

# 生成完整示例数据集
number_of_debates_from_1803_1910 <- structure(list(decade = c(1800L, 1810L, 1820L, 1830L, 1840L,  1850L, 1860L, 1870L, 1880L, 1890L, 1900L, 1910L), 
                                                   no_of_debates = c(926L, 2435L, 2400L, 7848L, 7398L, 8835L, 10660L,14051L,31509L,31857L,49725L,5631L )), 
                                              row.names = c(NA, -12L), class = c("data.table", "data.frame" ))

number_of_debates_from_1803_1910 %>%
  # 显式指定按decade字段分组,每个柱子对应唯一高亮项
  highlight_key(~decade) %>%
  plot_ly(
    x = ~decade, 
    y = ~no_of_debates, 
    type = 'bar', 
    text = ~paste0("Decade: ", "<b>", decade, "</b>", "\n",
                   "Number of Debates: ", "<b>", no_of_debates, "</b>", "\n"),
    hoverinfo = "text",
    marker = list(color = 'rgb(158,202,225)',
                  line = list(color = 'rgb(8,48,107)',
                              width = 1.5))) %>% 
  highlight(on = "plotly_click", off = "plotly_doubleclick",
            # 可选配置:显式指定选中样式,进一步避免默认样式异常
            selected = attrs_selected(marker = list(color = 'rgb(255,127,14)',
                                                    line = list(color = 'rgb(127,0,0)',
                                                                width = 2)))
            ) %>%
  layout(xaxis = list(title = ""),
         yaxis = list(title = "")) %>%
  config(displayModeBar = F) 

补充说明

如果业务场景确实需要保留barmode = "overlay"配置,仅需保留代码中selected参数的显式配置,同时在highlight_key中指定分组字段即可解决半高亮问题。


内容的提问来源于stack exchange,提问作者generic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:36:06