Shiny中使用color aesthetic时plotly_hover数据索引不匹配问题求助
解决Shiny中Plotly悬停时分组数据索引错误的问题
当用ggplot结合color aesthetic生成Plotly图后,用plotly_hover的pointNumber取原始数据框行时会出错——因为Plotly会按每个color分组单独计数pointNumber,而非使用原始数据的全局行号。比如你示例里的col="b"分组,它的pointNumber是从0重新开始计数的,所以前4个点的pointNumber+1会对应到原始数据中col="a"的行,只有当pointNumber>=4时才会命中col="b"的正确行。
解决方法:给每个点绑定全局行索引作为key
在ggplot的aes中加入key = row.names(df)(或者直接用key = 1:nrow(df)),这样Plotly会把全局行索引存在event_data的key字段里,直接用这个值就能准确获取原始数据的对应行。
修改后的完整代码:
library(shiny) library(ggplot2) library(plotly) ui <- fluidPage( titlePanel("Plotly reprex app"), fluidRow( plotlyOutput("plotlyPlot", height = "700px"), verbatimTextOutput("memberDetails") ) ) server <- function(input, output, session) { df <- data.frame(x = 1:10, y = 1:10, col = c(rep("a", 4), rep("b", 6))) output$plotlyPlot <- renderPlotly({ t_p <- df %>% ggplot(aes(x = x, y = y, color = col, text = col, key = row.names(df))) + geom_point() ggplotly(t_p, tooltip = "text") }) output$memberDetails <- renderPrint({ event_data <- event_data("plotly_hover") if(is.null(event_data)) return(NULL) # 直接用key作为行索引,转成数值类型 point_index <- as.numeric(event_data$key[1]) df_select <- df[point_index, ] cat("color is: ", df_select$col) }) } shinyApp(ui = ui, server = server)
补充说明
- 加入
key后,Plotly会在交互事件中携带这个全局索引,不受分组影响,完美解决跨分组的索引错误问题。 - 也可以用
aes(key = 1:nrow(df))替代row.names(df),效果完全一致,都是绑定全局行号。
内容的提问来源于stack exchange,提问作者Honestiore
相关产品推荐
相关产品推荐

