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

