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

R中ggplotly绘制geom_area面积图时所有X轴tooltip值相同的问题

解决ggplotly转换geom_area时tooltip值一致的问题

方案1:自定义tooltip文本并手动控制堆叠计算

通过预先计算堆叠后的y值,在ggplot的aes中指定自定义tooltip内容,让plotly正确显示每个分组的原始数值:

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

# 创建数据
time <- as.numeric(rep(seq(1,7),each=7))  
value <- runif(49, 10, 100)               
group <- rep(LETTERS[1:7],times=7)        
data <- data.frame(time, value, group)

# 计算堆叠累积值,保留原始value用于tooltip
data_stacked <- data %>%
  arrange(time, group) %>%
  group_by(time) %>%
  mutate(y_stacked = cumsum(value)) %>%
  ungroup()

# 绘制并指定自定义tooltip
p <- ggplot(data_stacked, aes(x = time, y = y_stacked, fill = group, 
                              text = paste("Time:", time, "<br>Group:", group, "<br>Value:", round(value, 2)))) +
  geom_area(position = "stack")

ggplotly(p, tooltip = "text")

方案2:使用plotly原生函数绘制堆叠面积图

绕过ggplot到plotly的转换,直接用plotly原生API绘制,避免兼容性问题:

library(plotly)
library(dplyr)

# 创建数据
time <- as.numeric(rep(seq(1,7),each=7))  
value <- runif(49, 10, 100)               
group <- rep(LETTERS[1:7],times=7)        
data <- data.frame(time, value, group)

# 转换为宽格式
data_wide <- data %>%
  pivot_wider(names_from = group, values_from = value)

# 原生plotly绘制堆叠面积图
plot_ly(data_wide, x = ~time) %>%
  add_area(y = ~A, name = "A", hoverinfo = "x+y+name") %>%
  add_area(y = ~B, name = "B", hoverinfo = "x+y+name") %>%
  add_area(y = ~C, name = "C", hoverinfo = "x+y+name") %>%
  add_area(y = ~D, name = "D", hoverinfo = "x+y+name") %>%
  add_area(y = ~E, name = "E", hoverinfo = "x+y+name") %>%
  add_area(y = ~F, name = "F", hoverinfo = "x+y+name") %>%
  add_area(y = ~G, name = "G", hoverinfo = "x+y+name") %>%
  layout(yaxis = list(title = "Value"), xaxis = list(title = "Time"), barmode = "stack")

方案3:调整ggplot的映射参数

明确指定group映射并使用stat="identity",同时自定义tooltip:

library(ggplot2)
library(plotly)

# 创建数据
time <- as.numeric(rep(seq(1,7),each=7))  
value <- runif(49, 10, 100)               
group <- rep(LETTERS[1:7],times=7)        
data <- data.frame(time, value, group)

# 调整ggplot的aes参数
p <- ggplot(data, aes(x = time, y = value, fill = group, group = group,
                      text = paste("Time:", time, "\nGroup:", group, "\nValue:", round(value, 2)))) +
  geom_area(stat = "identity")

ggplotly(p, tooltip = "text")

问题原因

该异常是ggplot2 3.4.0与plotly 4.10.1的兼容性bug:geom_area绘制堆叠面积图时会自动计算累积y值,但ggplotly在转换过程中,没有正确将每个分组的原始value映射到tooltip,反而重复显示了同一个数值。上述方案通过自定义tooltip、绕过转换或调整映射参数,均可解决该问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:57:16