Shiny中ggplot悬停信息不显示问题求助
我来帮你梳理下可能导致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交互。
总结修正步骤
- 补全
output$hover_info的输出逻辑; - 修正数据过滤的语法错误,用reactive表达式封装;
- 修正ggplot的x轴标签语法;
- 修正geom_smooth的数据子集筛选逻辑。
先把这些点修正后再测试,应该能恢复hover功能。
内容的提问来源于stack exchange,提问作者lewisnix21

