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
相关产品推荐
相关产品推荐

