我可以以编程方式控制 plotly 缩放功能,而不必在 R shiny 应用程序中重新绘制吗?

Can I programmatically control plotly zoom functionality without having to re-plot in an R shiny app?

我正在尝试使用 Plotly 绘图在 R 中制作一个闪亮的应用程序。 我正在尝试在闪亮应用程序的后端创建缩放功能,以响应绘图图上的单击事件(即单击某个点时,放大该点)。但是,到目前为止我找到的唯一解决方案是使用新的视图范围完全重新布局 plotly 对象。

对于大图,这非常慢,因为 shiny 会重新渲染整个图,并且比 plotly 的前端内置缩放功能(右上角的 plotly 用户界面按钮)慢得多。数据点的数量很大。有没有办法在后端使用 plotly 缩放功能,这样整个 plotly 对象就不必重新渲染来缩放?

示例:

library(plotly)
library(shiny)

ui <- fluidPage(
  plotlyOutput("scatter")
)
server <- function(input, output) {
  zoom_vals = reactiveValues(xrange=NA,yrange=NA)
  # Plot scatter plot
  output$scatter <- renderPlotly({
    data <- data.frame(x=sample.int(1000,100), y = sample.int(1000,100))
    x_axis = list(range = zoom_vals$xrange)
    y_axis = list(range = zoom_vals$yrange)
    plot_ly(data, x = ~x, y = ~y) %>% layout(xaxis=x_axis, yaxis=y_axis)
  })
  # Catch plot click
  observeEvent(event_data("plotly_click"),{
    d<-event_data("plotly_click")
    zoom_vals$xrange <- c((d$x- 1),(d$x+ 1))
    zoom_vals$yrange <- c((d$y- 1),(d$y- 1))
  })
}
shinyApp(ui, server)

您可以通过 plotlyProxyInvoke.

修改(不重新渲染)闪亮的现有绘图对象

要更改轴范围,我们需要 relayout 方法:

library(plotly)
library(shiny)

ui <- fluidPage(plotlyOutput("scatter"))

server <- function(input, output) {
  # Plot scatter plot
  output$scatter <- renderPlotly({
    data <- data.frame(x = sample.int(1000, 100), y = sample.int(1000, 100))
    plot_ly(data, x = ~ x, y = ~ y, type = "scatter", mode = "markers")
  })
  
  scatterProxy <- plotlyProxy("scatter")
  
  # Catch plot click
  observeEvent(event_data("plotly_click"), {
    d <- event_data("plotly_click")
    xrange <- c((d$x - 100), (d$x + 100))
    yrange <- c((d$y - 100), (d$y + 100))
    plotlyProxyInvoke(scatterProxy, "relayout", list(xaxis = list(range = xrange), yaxis = list(range = yrange)))
  })
}

shinyApp(ui, server)