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

Shiny中ggplot悬停信息不显示问题求助

排查Shiny中ggplot hover功能失效的问题

我来帮你梳理下可能导致hover功能失效的几个关键点,结合你提供的代码逐一分析:

1. 缺失hover信息的输出逻辑

你的UI里已经添加了verbatimTextOutput("hover_info")来展示悬停信息,但在Server端完全没有对应的输出处理代码!hoverOpts(id = "plot_hover")只是告诉Shiny监听这个绘图的hover事件,但没有编写代码把hover捕获到的信息展示出来,这就是为什么只有十字光标却没内容的核心原因之一。

你需要在Server里添加这段代码来处理hover信息:

output$hover_info <- renderPrint({
  req(input$plot_hover)
  # 用nearPoints获取悬停位置附近的数据点
  nearPoints(filtered_data(), input$plot_hover, threshold = 10, maxpoints = 1, addDist = TRUE)
})

2. 数据过滤的语法错误

看你Server里的代码:

data <- data[data$day %in% input$Day]
data <- data[data$month %in% input$Month]

这里少了逗号,正确的子集筛选语法应该是data[data$day %in% input$Day, ](逗号保留行维度)。你现在的写法会把数据框转换成向量,导致ggplot无法正确识别数据结构,不仅绘图会出问题,hover交互自然也失效了。

建议把数据过滤封装成reactive表达式,更清晰且避免重复:

filtered_data <- reactive({
  req(input$Day, input$Month)
  data[data$day %in% input$Day & data$month %in% input$Month, ]
})

然后在renderPlot里用filtered_data()替代原来的data。

3. ggplot语法的小问题

你的ggplot初始化代码里:

g <- ggplot(data, aes(Date, NUMBER_OF_TRANSFERS), xlab=("Call Transfers")) + geom_point() + labs(y = "Call Transfers")

xlab参数放错位置了,它不能作为ggplot()的参数,应该放到labs()里或者单独用xlab()函数修正:

g <- ggplot(filtered_data(), aes(Date, NUMBER_OF_TRANSFERS)) + 
  geom_point() + 
  labs(x = "Call Transfers", y = "Call Transfers")

4. geom_smooth的数据子集逻辑错误

比如这段代码:

if (Curves == "Outages") g <- g + geom_smooth(data=(data[Outage == "Outage"]), aes(color = (Outage[Outage == "Outage"]))) + ...

这里的Outage是input$Outage(布尔值),但你用Outage == "Outage"做筛选,逻辑完全错误。应该基于数据框里的Outage列来筛选,比如filtered_data()[filtered_data()$Outage == "Outage", ],否则会得到空的数据集,导致图层加载异常,间接影响hover交互。

总结修正步骤

  1. 补全output$hover_info的输出逻辑;
  2. 修正数据过滤的语法错误,用reactive表达式封装;
  3. 修正ggplot的x轴标签语法;
  4. 修正geom_smooth的数据子集筛选逻辑。

先把这些点修正后再测试,应该能恢复hover功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:11:56