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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 19:09:58