我试图做一些看似简单的事情:当用户点击数据点或用套索选择选择多个点时,我想用不同的颜色绘制这些点。为了做到这一点,我查看选择了哪些点,并在数据框中添加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)
我也被告知,或许我需要做的是创建自己的行标识符并将其传递给key
美学。我不确定这是什么意思我尝试定义key <- row.names(data)
然后将key=key
传递给ggplot&#39; s aes(),但这似乎并没有改变任何东西。
答案 0 :(得分:4)
Carson Sievert回答了我的问题on a gist
以下是答案:
我知道这似乎是违反直觉的,但是pointNumber不是一个可靠的行标识符。使用这样的键变量:
[
{"heure":"22:04:20","data1":"28","data2":"67"},
{"heure":"22:07:27","data1":"28","data2":"43"},
{"heure":"22:08:08","data1":"28","data2":"30"},
{"heure":"19:00:00","data1":"32","data2":"23"}
]
答案 1 :(得分: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)
答案 2 :(得分:0)
以下是plot_ly
方法,使用了customdata
属性:
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", priority = "event")
select_data <- event_data("plotly_selected", priority = "event")
if (!is.null(select_data)) {
mtcars[mtcars$key %in% select_data$customdata, "col"] <- "blue"
}
if (!is.null(click_data)) {
mtcars[mtcars$key %in% click_data$customdata, "col"] <- "red"
}
p <- plot_ly(mtcars, x = ~mpg, y=~wt, colors = ~sort(unique(col)), color = ~col, customdata = ~key, type = "scatter", mode = "markers") %>% layout(dragmode = "lasso")
})
}
shinyApp(ui, server)
plot_ly
也可以用相同的方式处理key
参数。但是,customdata
多了official way:
key属性仅在闪亮时受支持,而customdata是 由plotly.js正式支持,因此也可以用于附加 事件的元信息
可以通过以下方式查看文档:
library(listviewer)
schema(jsonedit = interactive())
导航:对象►轨迹►分散►属性►customdata