9

我正在尝试做一些看似简单的事情:当用户单击数据点或使用套索选择选择多个点时,我想用不同的颜色绘制这些点。为了做到这一点,我查看选择了哪些点,并向数据框添加一个col变量,然后告诉 ggplot 根据该列对点进行着色。

它确实适用于第一个选择。但是,只要已经选择了点,选择下一组点就不起作用。pointNumber我添加了调试语句以查看从 plotly 返回的数据,并且它似乎curveNumber在初始选择之后返回不同。我找不到任何关于这些变量如何工作的文档,我不确定如何解决这个问题。

这是一个显示问题的 GIF

这是重现的代码:

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(),但这似乎并没有改变任何东西。

4

3 回答 3

6

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)
于 2017-09-19T17:09:48.040 回答
2

这是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官方的方式是:

key 属性仅在 shiny 中支持,而 customdata 由 plotly.js 官方支持,因此也可以用于将元信息附加到事件

可以通过以下方式查看文档:

library(listviewer)
schema(jsonedit = interactive())

导航:对象 ► 跟踪 ► 分散 ► 属性 ► 自定义数据

于 2019-10-24T14:44:34.077 回答
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)

在此处输入图像描述

于 2017-09-19T16:23:41.917 回答