Dea*_*ali 6 r shiny plotly ggplotly
我正在尝试做一些看似简单的事情:当用户点击数据点或用套索选择选择多个点时,我想用不同的颜色绘制这些点.为了做到这一点,我查看选择了哪些点,并向col数据框添加变量,并告诉ggplot根据该列为点着色.
它确实适用于第一个选择.但是,只要已经选择了点,选择下一组点就不起作用了.我已经添加调试语句看到的是从plotly返回什么数据,而且好像它返回不同pointNumber和curveNumber初始选择之后.我找不到任何关于这些变量如何工作的文档,我不知道如何解决这个问题.
这里是重现的代码:
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)
Run Code Online (Sandbox Code Playgroud)
我也被告知,或许我需要做的是创建自己的行标识符并将其传递给key美学.我不确定这意味着我尝试定义key <- row.names(data)然后传递key=key给ggplot的aes(),但这似乎没有改变任何东西.
卡森·西维特(Carson Sievert)回答了我的要点
答案如下:
我知道这似乎违反直觉,但是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)
Run Code Online (Sandbox Code Playgroud)
您可以将其映射到您正在绘制的变量:
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)
Run Code Online (Sandbox Code Playgroud)