我是否可以通过编程控制绘图缩放功能,而无需在R应用程序中重新绘图?

我是否可以通过编程控制绘图缩放功能,而无需在R应用程序中重新绘图?,r,shiny,plotly,r-plotly,shiny-reactivity,R,Shiny,Plotly,R Plotly,Shiny Reactivity,我正试图在R中使用绘图制作一个闪亮的应用程序。 我正在尝试在一个闪亮的应用程序的后端创建缩放功能,以响应plotly graph上的单击事件(即,单击某个点时,放大该点)。但是,到目前为止,我找到的唯一解决方案是使用新的视图范围完全重新布局plotly对象 对于大型绘图,这是非常慢的,因为Shining会重新渲染整个绘图,并且在数据点数量较大时,这比前端的plotly内置缩放功能(右上角的plotly用户界面按钮)慢得多。是否有办法在后端使用plotly zoom功能,使整个plotly对象不必

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

对于大型绘图,这是非常慢的,因为Shining会重新渲染整个绘图,并且在数据点数量较大时,这比前端的plotly内置缩放功能(右上角的plotly用户界面按钮)慢得多。是否有办法在后端使用plotly zoom功能,使整个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)
library(plotly)
图书馆(闪亮)
ui您可以通过
plotlyProxyInvoke
修改(无需重新渲染)中现有的plotly对象

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

library(plotly)
图书馆(闪亮)

这个界面工作得很好。非常感谢您提供了这个简洁的解决方案!不客气!如果有帮助,请考虑接受答案。
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)