如何利用Plotly事件数据唯一识别选中的点?解决坐标精度问题
解决Plotly event_data坐标四舍五入导致无法准确识别选中数据的问题
来自
event_data的坐标会被四舍五入,如何确保能准确识别选中的数据?例如选中两个中心点位时,event_data返回的x值相同:
用户提供的测试代码:
library(shiny) library(plotly) library(ggplot2) ui = fluidPage( # Plot plotlyOutput("plot"), # Table for x y coordinates tableOutput("text") ) # Create plot dataDf = data.frame(x = c(-10, 1.004, 1.005, 10), y = c(-10, 0, 0, 10)) plt = ggplot(dataDf, aes(x = x, y = y)) + geom_point() ply = ggplotly(plt, source = "plot") server = function(input, output) { # Display plot output$plot = renderPlotly(ply) # Show x and y values of selected points in a table output$text = renderTable({ eventData = event_data("plotly_selected", source = "plot") data.frame(x = eventData$x, y = eventData$y) }) } shinyApp(ui, server)
解决方案:通过自定义数据传递原始索引
核心思路是给每个点绑定原始数据的行索引,绕过event_data返回的精度丢失问题,直接从原始数据中提取准确值。
修改后的完整代码:
library(shiny) library(plotly) library(ggplot2) ui = fluidPage( # 绘图区域 plotlyOutput("plot"), # 显示选中点的坐标表格 tableOutput("text") ) # 创建数据集与绘图 dataDf = data.frame(x = c(-10, 1.004, 1.005, 10), y = c(-10, 0, 0, 10)) # 为每个点绑定原始数据的行号作为自定义数据 plt = ggplot(dataDf, aes(x = x, y = y, customdata = row_number())) + geom_point() ply = ggplotly(plt, source = "plot") server = function(input, output) { # 渲染绘图 output$plot = renderPlotly(ply) # 显示选中点的准确坐标 output$text = renderTable({ eventData = event_data("plotly_selected", source = "plot") if (!is.null(eventData)) { # 通过customdata匹配原始数据,获取无精度丢失的坐标 dataDf[eventData$customdata, ] } else { # 未选中任何点时返回空表格 data.frame(x = numeric(0), y = numeric(0)) } }) } shinyApp(ui, server)
关键修改说明
- 在
ggplot的aes中添加customdata = row_number(),让每个点携带原始数据的行索引信息 - 在server端,不再直接使用
eventData$x和eventData$y,而是通过eventData$customdata的值去原始数据集dataDf中提取准确的坐标值
这样无论event_data返回的坐标精度如何,都能精准匹配到选中的原始数据点,彻底解决相近点无法区分的问题。
内容的提问来源于stack exchange,提问作者tomato_soup
相关产品推荐
相关产品推荐

