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