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

如何在flexdashboard的ggplot2堆叠柱状图中添加悬停交互展示详情?

在flexdashboard中为ggplot2堆叠柱状图添加交互详情展示

方法一:用plotly实现悬停提示

如果只需要悬停时展示分组基本信息(含人数),可以直接将ggplot转换为plotly对象,自定义悬停内容:

代码示例

library(tidyverse)
library(flexdashboard)
library(plotly)

# 模拟处理后的长格式数据
set.seed(123)
data <- tibble(
  姓名 = paste0("参与者", 1:50),
  年龄 = sample(18:60, 50, replace = TRUE),
  职业 = sample(c("computer shop", "retail", "service", "office"), 50, replace = TRUE),
  消费状态 = sample(c("Yes", "No"), 50, replace = TRUE),
  商业计划消费状态 = sample(c("Yes", "No"), 50, replace = TRUE)
) %>%
  gather(key = "类别", value = "状态", -姓名, -年龄, -职业)

# 绘制基础ggplot堆叠柱状图
p <- ggplot(data, aes(x = 类别, fill = 状态)) +
  geom_bar(position = "stack") +
  facet_wrap(~职业) +
  labs(x = "类别", y = "人数", fill = "状态") +
  theme_bw()

# 转换为plotly并自定义悬停文本
ggplotly(p, tooltip = "text") %>%
  style(text = ~paste0("职业: ", 职业, "<br>",
                       "类别: ", 类别, "<br>",
                       "状态: ", 状态, "<br>",
                       "总人数: ", ..count..))

悬停时会显示对应柱状区域的职业、类别、状态及该分组的总人数。


方法二:用shiny实现点击后展示参与者列表

如果需要点击柱状区域后展示具体参与者的姓名、年龄等详情,可以借助flexdashboard的shiny运行时实现:

第一步:设置flexdashboard运行时

确保你的flexdashboard开头YAML配置如下:

---
title: "消费数据仪表盘"
output: 
  flexdashboard::flex_dashboard:
    runtime: shiny
---

第二步:添加交互代码

library(tidyverse)
library(flexdashboard)
library(shiny)

# 模拟处理后的长格式数据
set.seed(123)
data <- tibble(
  姓名 = paste0("参与者", 1:50),
  年龄 = sample(18:60, 50, replace = TRUE),
  职业 = sample(c("computer shop", "retail", "service", "office"), 50, replace = TRUE),
  消费状态 = sample(c("Yes", "No"), 50, replace = TRUE),
  商业计划消费状态 = sample(c("Yes", "No"), 50, replace = TRUE)
) %>%
  gather(key = "类别", value = "状态", -姓名, -年龄, -职业)

### 交互图表
```{r}
renderPlot({
  ggplot(data, aes(x = 类别, fill = 状态)) +
    geom_bar(position = "stack") +
    facet_wrap(~职业) +
    labs(x = "类别", y = "人数", fill = "状态") +
    theme_bw()
}, click = "plot_click")

参与者详情表格

renderTable({
  # 获取点击位置对应的分组信息
  click_info <- nearPoints(data, input$plot_click, threshold = 10, maxpoints = 1)
  
  if(nrow(click_info) == 0){
    return(tibble(提示 = "点击任意柱状区域查看对应参与者详情"))
  }
  
  # 筛选符合条件的所有参与者
  data %>%
    filter(职业 == click_info$职业[1],
           类别 == click_info$类别[1],
           状态 == click_info$状态[1]) %>%
    select(姓名, 年龄, 职业, 类别, 状态)
})

点击任意柱状区域后,下方表格会自动展示该分组下所有参与者的姓名、年龄等信息。threshold参数可调整点击灵敏度,数值越大允许的点击范围越广。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 22:54:20