在剧情中任何地方进行剧情点击事件

时间:2019-05-17 20:24:07

标签: r-plotly

我是r-plotly的新手,他试图弄清楚如何处理不在数据上的点击。看来,使用event_data("plotly_click")可以从数据中获取与点有关的事件,但到目前为止,还没有弄清楚如何对不接近数据但仅在图的白色部分上的点击执行此操作

图中的闪亮点击事件可以做到这一点,而我只得到点击的x和y。我想要类似的东西,但是要密谋。

我可以指定点击事件来自绘图区中的任何地方,而不仅仅是数据上吗?

编辑:令人惊讶的是,这在计划中还不存在。查看此功能请求

https://github.com/plotly/plotly.js/issues/2696

https://github.com/ropensci/plotly/issues/1194

因此,在添加此功能之前,我想我的问题是有哪些选项可以做到这一点?似乎是一项基本功能,希望我对JavaScript / Shiny / Plotly有更深入的了解。

1 个答案:

答案 0 :(得分:0)

请根据我通过this问题发现的this Codepen,检查以下变通方法。

但是,到目前为止我还不能消除一个小的水平偏移量-也许有人知道如何解决这个问题?

library(plotly)
library(shiny)
library(htmlwidgets)

ui <- fluidPage(
  plotlyOutput("graph"),
  verbatimTextOutput("click")
)

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

  js <- "
    function(el, x, inputName){
      var id = el.getAttribute('id');
      var gd = document.getElementById(id);
      var d3 = Plotly.d3;
      Plotly.plot(id).then(attach);
        function attach() {
          var xaxis = gd._fullLayout.xaxis;
          var yaxis = gd._fullLayout.yaxis;
          var l = gd._fullLayout.margin.l;
          var t = gd._fullLayout.margin.t;
          var coordinates = [null, null]

          gd.addEventListener('click', function(evt) {
            var coordinates = [xaxis.p2c(evt.x - l), yaxis.p2c(evt.y - t)];
            Shiny.setInputValue(inputName, coordinates);
          });
        };
  }
  "
  clickposition_history <- reactiveVal(data.frame(x = 1:10, y = 1:10))

  observeEvent(input$clickposition, {
    clickposition_history(rbind(clickposition_history(), input$clickposition))
  })

  output$graph <- renderPlotly({
      plot_ly(clickposition_history(), x = ~x, y = ~y, type = "scatter", mode = "markers") %>%
      onRender(js, data = "clickposition")
  })

  output$click <- renderPrint({
    input$clickposition
  })
}

shinyApp(ui, server)

Result