使用patchwork组合giraffe图表时,交互式悬停效果未同步
解决ggiraph组合图同步悬停高亮问题
问题分析
当前代码虽给两个图都设置了data_id = drv,但悬停不同步的核心问题有两点:一是第二个图(g2)的箱线图分组逻辑不清晰,导致data_id绑定的交互范围出错;二是opts_hover未定义高亮样式,悬停视觉反馈不明确。
修改后的代码
library(tidyverse) library(ggiraph) library(patchwork) # 第一个图:按drv排序的箱线图 g1 <- mpg %>% mutate(drv = fct_reorder(drv, hwy)) %>% ggplot(aes(x = hwy, y = drv, fill = drv, data_id = drv)) + geom_boxplot_interactive() + theme(legend.position = 'none') # 第二个图:按class排序,按drv分组的箱线图 g2 <- mpg %>% mutate(class = fct_reorder(class, hwy)) %>% ggplot(aes(x = hwy, y = class, fill = drv, data_id = drv, group = interaction(class, drv))) + geom_boxplot_interactive() + theme(legend.position = 'none') # 生成带同步悬停的交互式组合图 girafe( ggobj = g1 + plot_spacer() + g2 + plot_layout(widths = c(0.45, 0.1, 0.45)), options = list( # 定义悬停高亮样式 opts_hover(css = "fill: #ff7f0e; stroke: #2c3e50; stroke-width: 2px;"), # 定义非悬停元素的透明效果 opts_hover_inv(css = "opacity: 0.2;"), opts_sizing(rescale = FALSE) ), height_svg = 5, width_svg = 9 )
关键修改说明
- 给g2添加
group = interaction(class, drv):确保每个class下的不同drv生成独立箱线图,同时让data_id = drv能正确绑定到对应分组。 - 完善
opts_hover的CSS样式:明确悬停时的填充色、边框样式,让高亮效果清晰可辨。 - 保留跨图的
data_id = drv:这是同步悬停的核心,ggiraph会识别所有相同data_id的元素,实现跨图同步高亮/变暗。
效果说明
鼠标悬停g1中任意drv的箱线图时,g2中所有属于该drv的箱线图会同步高亮,其余元素变暗;反之,悬停g2中某drv的箱线图,g1中对应drv的箱线图也会同步高亮。
内容的提问来源于stack exchange,提问作者rez
相关产品推荐
相关产品推荐

