2017-09-19 10 views
2

一見簡単なことをしようとしています。ユーザーがデータポイントをクリックしたり、これらの点を別の色で描きます。これを行うために、どの点が選択されているかを見て、col変数をデータフレームに追加し、ggplotにその列に従ってポイントの色を付けるように指示します。plotlyを使用して、データを変更した後でも選択したポイントの同じevent_data情報を返す方法

最初の選択では機能します。しかし、すでに選択されているポイントがある場合は、次のポイントのセットを選択することはできません。デバッグ文を追加してplotlyから返されるデータを確認しました。最初の選択後に異なるpointNumbercurveNumberを返すようです。これらの変数がどのように機能するかについてのドキュメントは見つかりませんでしたが、この問題の修正方法がわかりません。ここで

GIF showing the issue

だし、ここに再現するためのコードです:

library(plotly) 
library(shiny) 

ui <- fluidPage(
    plotlyOutput("plot") 
) 

server <- function(input, output, session) { 
    output$plot <- renderPlotly({ 
    click_data <- event_data("plotly_click", source = "select") 
    select_data <- event_data("plotly_selected", source = "select") 
    data <- mtcars 
    data$col <- "black" 
    if (!is.null(select_data)) { 
     cat(str(select_data)) 
     idx <- select_data$pointNumber + 1 
     data[idx, "col"] <- "blue" 
    } 
    if (!is.null(click_data)) { 
     cat(str(click_data)) 
     idx <- click_data$pointNumber + 1 
     data[idx, "col"] <- "red" 
    } 
    p <- ggplot(data, aes(mpg, wt, col = I(col))) + geom_point() 
    ggplotly(p, source = "select") 
    }) 
} 

shinyApp(ui, server) 

私も多分私は何をする必要があることは私自身の行識別子を作成し、key審美的にそれを渡していることを言われてきました。私はkey <- row.names(data)を定義してから、key=keyをggplotのaes()に渡そうとしていたのですが、何も変更されていないようです。

答えて

0

あなたは多分あなたがプロットされている変数に対してそれをマッピングすることができます

library(plotly) 
library(shiny) 

ui <- fluidPage(
    plotlyOutput("plot") 
) 

server <- function(input, output, session) { 

    output$plot <- renderPlotly({ 
    click_data <- event_data("plotly_click", source = "select") 
    select_data <- event_data("plotly_selected", source = "select") 

    data <- mtcars 

    data$col <- "black" 
    if (!is.null(select_data)) { 
     idx <- which(data$mpg %in% c(select_data[3]$x) | data$wt %in% c(select_data[4]$y)) 
     data[idx, "col"] <- "blue" 
    } 
    if (!is.null(click_data)) { 
     idx <- click_data$pointNumber + 1 
     data[idx, "col"] <- "red" 
    } 
    p <- ggplot(data, aes(mpg, wt, col = I(col))) + geom_point() 
    ggplotly(p, source = "select") 
    }) 
} 

shinyApp(ui, server) 

enter image description here

+0

返されるx/yが常に元のデータの値と正確に一致するとは限りませんので、意図的にそれを避けていました。私はpointNumber/curveNumberがどのように動作するかを理解しようとしていますが、それは私にとっては非常に奇妙なようですが、明らかにその背後にはいくつかの論理があるはずです –

1

カーソンシーベルトがon a gist

私の質問に答えここに答えます:

私はそれはそう知っていますcounter直観的ですが、pointNumberは信頼できる行識別子ではありません。

library(plotly) 
library(shiny) 

mtcars$key <- row.names(mtcars) 
mtcars$col <- "black" 

ui <- fluidPage(
    plotlyOutput("plot") 
) 

server <- function(input, output, session) { 
    output$plot <- renderPlotly({ 
    click_data <- event_data("plotly_click") 
    select_data <- event_data("plotly_selected") 
    if (!is.null(select_data)) { 
     mtcars[mtcars$key %in% select_data$key, "col"] <- "blue" 
    } 
    if (!is.null(click_data)) { 
     mtcars[mtcars$key %in% click_data$key, "col"] <- "red" 
    } 
    p <- ggplot(mtcars, aes(mpg, wt, col = I(col), key = key)) + 
     geom_point() 
    ggplotly(p) %>% layout(dragmode = "lasso") 
    }) 
} 

shinyApp(ui, server) 
関連する問題