Plotly(R)中子图同步显示所有悬停数据的实现方案问询
实现Plotly R共享X轴子图的同步悬停显示
以下是修改后的函数代码,可实现鼠标悬停时同步显示所有子图对应X值的Y变量数据:
library(plotly) library(tidyverse) plotly_stacked <- function(df, x_colName, cols){ # 为每行生成包含所有Y变量的悬停文本 df_hover <- df %>% rowwise() %>% mutate(hover_text = paste0( x_colName, ": ", get(x_colName), "<br>", paste(cols[cols != x_colName], ": ", get(cols[cols != x_colName]), collapse = "<br>") )) %>% ungroup() # 转换为长格式用于绘图 DF <- df_hover[, c(cols, "hover_text")] %>% tidyr::gather(variable, value, -all_of(c(x_colName, "hover_text"))) %>% transform(id = as.integer(factor(variable))) DF$variable <- factor(DF$variable, levels = unique(DF$variable)) p <- plot_ly(data = DF, x = ~get(x_colName), y = ~value, color = ~variable, colors = "Dark2", yaxis = ~paste0("y", sort(id, decreasing = F)), text = ~hover_text, # 绑定自定义悬停文本 hoverinfo = "text") %>% # 指定使用自定义文本作为悬停内容 add_lines() %>% layout( xaxis = list(title = ""), legend = list(orientation = "h", xanchor = "center", x = 0.5), hovermode = "x unified" # 开启X轴统一悬停模式 ) %>% plotly::subplot(nrows = length(unique(DF$variable)), shareX = TRUE, titleY = TRUE) # 显示每个子图的Y轴标题(对应变量名) return(p) } # 测试数据 df <- data.frame( Time = c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9, 1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2), a = c(0.01,0.02,0.03,0.04,0.05,0.06,0.07, 0.08,0.09,0.1,0.11,0.12,0.13,0.14,0.15,0.16,0.17,0.18, 0.19,0.2), b = c(0.001,0.002,0.003,0.004,0.005,0.006, 0.007,0.008,0.009,0.01,0.011,0.012,0.013,0.014,0.015, 0.016,0.017,0.018,0.019,0.02), c = c(1e-04,2e-04,3e-04,4e-04,5e-04,6e-04, 7e-04,8e-04,9e-04,0.001,0.0011,0.0012,0.0013,0.0014, 0.0015,0.0016,0.0017,0.0018,0.0019,0.002) ) plotly_stacked(df, "Time", c( "Time" ,"a", "b", "c"))
关键改动说明
- 预处理悬停文本:通过
rowwise()为每行数据生成包含所有Y变量的悬停文本,确保每个轨迹都能访问到同一X值下的所有变量数据。 - 绑定自定义悬停内容:在
plot_ly()中指定text参数为生成的悬停文本,并设置hoverinfo = "text",让Plotly使用自定义内容作为悬停提示。 - 开启统一悬停模式:在
layout中设置hovermode = "x unified",实现鼠标移动时,所有子图在同一X位置的悬停信息同步触发显示。 - 优化子图标题:添加
titleY = TRUE让每个子图自动显示对应变量名作为Y轴标题,提升可读性。
运行修改后的代码后,鼠标悬停在任意子图的X位置时,所有子图都会同步显示该X值对应的所有Y变量数据。
内容的提问来源于stack exchange,提问作者ACE
相关产品推荐
相关产品推荐

