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

ggplot2堆叠柱状图结合ggplotly后出现多切片悬停问题如何解决

问题根因

你提供的输入数据中,Site + Group的组合存在大量重复行,geom_bar(stat="identity")默认会将每一行数据作为独立的堆叠单元渲染,因此会出现多个细碎切片,每个切片都有独立悬停提示;同时最终柱形的高度会是所有重复行的Patients值之和,和你预期的数值也会存在偏差。

解决方法

最直接的方案是先对数据按Site和Group维度聚合,保证每个分组仅对应唯一一行数据,再进行绘图:

Tar2<-structure(list(Site = c("ABC123", "ABC123", "ABC123", "ABC123", 
"ABC123", "ABC123", "ABC123", "ABC123", "ABC123", "ABC123", "ABC123", 
"ABC123", "ABC123", "ABC123", "ABC123", "ABC123", "ABC123", "ABC123", 
"ABC123", "ABC123", "ABC123", "ABC123", "ABC123", "ABC123", "ABC123", 
"ABC123", "ABC123", "ABC123", "ABC123", "ABC123", "ABC123", "ABC123", 
"ABC123", "ABC123", "ABC123", "ABC123", "ABC123", "ABC123", "ABC123", 
"ABC123"), Group = c("A", "A", "B", "B", "A", "A", "A", "A", 
"B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", 
"B", "A", "A", "B", "B", "B", "B", "A", "A", "B", "B", "B", "B", 
"B", "B", "B", "B", "A", "A"), Patients = c(46L, 46L, 46L, 46L, 
46L, 46L, 46L, 46L, 46L, 46L, 46L, 46L, 46L, 46L, 46L, 46L, 46L, 
46L, 46L, 46L, 46L, 46L, 46L, 46L, 46L, 46L, 46L, 46L, 46L, 46L, 
46L, 46L, 46L, 46L, 46L, 46L, 46L, 46L, 46L, 46L)), row.names = c(NA, 
-40L), class = c("tbl_df", "tbl", "data.frame"))

library(ggplot2)
library(dplyr)
library(plotly)

# 按站点、分组聚合数据,去除重复项
Tar2_agg <- Tar2 %>%
  group_by(Site, Group) %>%
  # 可根据实际业务需求调整聚合逻辑,需要求和则替换为sum(Patients)
  summarise(Patients = unique(Patients), .groups = "drop")

# 绘图
p <- ggplot(Tar2_agg, aes(fill=Group, y=Patients, x=Site)) +
  geom_bar(position="stack", stat="identity") +
  theme(axis.text.x = element_text(angle = 45, vjust = 0.5, hjust=1)) +
  labs(title = "Figure 2:Weekly Enrollment by Cohort by Site")

# 生成交互式图表
ggplotly(p)

如果需要进一步自定义悬停提示的内容,避免显示多余字段,可以在绘图时自定义text参数指定悬停内容:

p <- ggplot(Tar2_agg, aes(fill=Group, y=Patients, x=Site,
                          text = paste("站点:", Site, "<br>分组:", Group, "<br>患者数:", Patients))) +
  geom_bar(position="stack", stat="identity") +
  theme(axis.text.x = element_text(angle = 45, vjust = 0.5, hjust=1)) +
  labs(title = "Figure 2:Weekly Enrollment by Cohort by Site")

# 仅显示自定义的悬停内容
ggplotly(p, tooltip = "text")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:45:02