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

