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

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"))

关键改动说明

  1. 预处理悬停文本:通过rowwise()为每行数据生成包含所有Y变量的悬停文本,确保每个轨迹都能访问到同一X值下的所有变量数据。
  2. 绑定自定义悬停内容:在plot_ly()中指定text参数为生成的悬停文本,并设置hoverinfo = "text",让Plotly使用自定义内容作为悬停提示。
  3. 开启统一悬停模式:在layout中设置hovermode = "x unified",实现鼠标移动时,所有子图在同一X位置的悬停信息同步触发显示。
  4. 优化子图标题:添加titleY = TRUE让每个子图自动显示对应变量名作为Y轴标题,提升可读性。

运行修改后的代码后,鼠标悬停在任意子图的X位置时,所有子图都会同步显示该X值对应的所有Y变量数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 00:13:21