【问题标题】:event when clicking a name in the legend of a plotly's graph in R Shiny在 R Shiny 中单击绘图图例中的名称时的事件
【发布时间】:2019-02-19 11:52:57
【问题描述】:

当用户单击绘图图的图例时,我想显示一些信息。 例如在下面的代码中,如果用户单击图例中的“drat”名称以取消显示这些数据,我想打印一个文本说“选择了 drat 和 qsec”。

我看过这个 stackoverflow 的帖子: R shiny and plotly getting legend click events 但它适用于标签。就我而言,标签不是可用参数。我已经测试了不同的情节事件,但是当我点击图例时没有返回任何信息(见下面的代码)。

有没有办法获得这些信息?

谢谢

library(plotly)
library(shiny)

ui <- fluidPage(
  plotlyOutput("plot"),
  verbatimTextOutput("hover"),
  verbatimTextOutput("click"),
  verbatimTextOutput("brush"),
  verbatimTextOutput("zoom")

)

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

  output$plot <- renderPlotly({
    p <- plot_ly()
    for(name in c("drat", "wt", "qsec"))
    {
      p = add_markers(p, x = as.numeric(mtcars$cyl), y = as.numeric(mtcars[[name]]), name = name)
    }

    p
  })

  output$hover <- renderPrint({
    d <- event_data("plotly_hover")
    if (is.null(d)) "Hover events appear here (unhover to clear)" else d
  })

  output$click <- renderPrint({
    d <- event_data("plotly_click")
    if (is.null(d)) "Click events appear here (double-click to clear)" else d
  })

  output$brush <- renderPrint({
    d <- event_data("plotly_selected")
    if (is.null(d)) "Click and drag events (i.e., select/lasso) appear here (double-click to clear)" else d
  })

  output$zoom <- renderPrint({
    d <- event_data("plotly_relayout")
    if (is.null(d)) "Relayout (i.e., zoom) events appear here" else d
  })

}

shinyApp(ui, server)

【问题讨论】:

    标签: r shiny plotly r-plotly


    【解决方案1】:

    为了完整起见:使用plotlyProxy,无需额外的JS也可以做到这一点:

    library(shiny)
    library(plotly)
    
    ui <- fluidPage(
      plotlyOutput("plot"),
      verbatimTextOutput("clickedLegendItem"),
      verbatimTextOutput("doubleclickedLegendItem")
    )
    
    server <- function(input, output, session) {
      
      output$plot <- renderPlotly({
        p <- plot_ly(source = "mySource")
        for(name in c("drat", "wt", "qsec"))
        {
          p = add_markers(p, x = as.numeric(mtcars$cyl), y = as.numeric(mtcars[[name]]), name = name)
        }
        p %>% event_register('plotly_legendclick') %>% event_register('plotly_legenddoubleclick')
      })
      
      myPlotlyProxy <- plotlyProxy("plot")
      
      legendClickEvents <- reactive({
        event_data(source = "mySource", "plotly_legendclick")
      })
      
      legendDoubleclickEvents <- reactive({
        event_data(source = "mySource", "plotly_legenddoubleclick")
      })
      
      output$clickedLegendItem <- renderPrint({
        clickedItem <- legendClickEvents()$name
        if (is.null(clickedItem)){"Clicked item appears here"} else {clickedItem}
      })
      
      output$doubleclickedLegendItem <- renderPrint({
        doubleclickedItem <- legendDoubleclickEvents()$name
        if (is.null(doubleclickedItem)){"Doubleclicked item appears here"} else {doubleclickedItem}
      })
    }
    
    shinyApp(ui, server)
    

    【讨论】:

      【解决方案2】:
      library(plotly)
      library(shiny)
      library(htmlwidgets)
      
      js <- c(
        "function(el, x){",
        "  el.on('plotly_legendclick', function(evtData) {",
        "    Shiny.setInputValue('trace', evtData.data[evtData.curveNumber].name);",
        "  });",
        "}")
      
      
      ui <- fluidPage(
        plotlyOutput("plot"),
        verbatimTextOutput("legendItem")
      )
      
      server <- function(input, output, session) {
      
        output$plot <- renderPlotly({
          p <- plot_ly()
          for(name in c("drat", "wt", "qsec"))
          {
            p = add_markers(p, x = as.numeric(mtcars$cyl), y = as.numeric(mtcars[[name]]), name = name)
          }
          p %>% onRender(js)
        })
      
        output$legendItem <- renderPrint({
          d <- input$trace
          if (is.null(d)) "Clicked item appear here" else d
        })
      }
      
      shinyApp(ui, server)
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-02
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      • 2019-07-27
      相关资源
      最近更新 更多