点击另一个图形时更改R中绘图的限制

3
我需要显示两个图。第一个图是主要散点图。第二个图必须在单击第一个图中的某个点时更改。因此,我需要与https://davidgohel.github.io/ggiraph/index.html 图片类似的行为。
更精确地说,第一个图的每个点必须与第二个图的x轴范围相关联。
我已经找到了一个对应的例子How to display many points from plotly_click in R Shiny? 并进行了相应的修改。
library(ggplot2)
library(plotly)
library(shiny)

ui <- fluidPage(
  plotlyOutput("plot1"),
  plotlyOutput("plot2")
)

range2=1000000
p1x=runif(10)
p1y=runif(10)
p1t=runif(10)*range2

times=seq(1,range2)
#ys=cumsum(rnorm(range2)/sqrt(range2))
ys=runif(range2)


plot2xlim=c(1000,2000)
p2 <- plot_ly()
p2 <- add_trace(p2, x = times, y = ys, type = "scattergl", mode = "lines",
                line = list(width = 1, color = "blue"))

server <- function(input, output, session) {
  # make plotly plot
  output$plot1 <- renderPlotly({
    g <- ggplot()+geom_point(aes(x=p1x,y=p1y))
    ggplotly(g)
  })
  output$plot2 <- renderPlotly({
    selpoint <- event_data("plotly_click")$pointNumber[1]+1
    plot2xlim <- c(p1t[selpoint]-500,p1t[selpoint]+500)
    p2 <<- layout(p2, xaxis = list(range = plot2xlim), 
                  yaxis = list(range = c(0, 1)))
    p2
  })
}
shinyApp(ui, server)

然而,由于plot2是为大量数据构建的,所以代码运行非常缓慢。因此重新构建它需要很多时间。

有没有办法在每次点击时不重新绘制第二个图,而只是更改其x轴限制?


1
你的示例出现了错误:"plotly"::"ggplotly"中的对象'p1t'未找到。 - dww
1
@dww 我已经将生成的样本数据插入到示例中。 - Viktor
2个回答

1
这不完全是你要求的,但我们可以构建一个带有x轴滑动条的plotly对象。重绘不是即时的,但比每次想改变范围时重新加载数据子集要快得多。
library(ggplot2)
library(plotly)

range2=1000000
p1x=runif(10)
p1y=runif(10)
p1t=runif(10)*range2
times=seq(1,range2)
ys=runif(range2)

# Put the data in a data frame
data <- data.frame(x = times, y = ys)

# Use ggplotly to take a ggplot object and covert it to plotly
p2 <- ggplot(data, aes(x = x, y = y)) + geom_line() 
ggplotly(p2) %>% rangeslider()

1

看起来没有办法绕过这个问题,因为图表中的每一次更改/查询都意味着重新渲染图表,自从Shiny在第一个图表上点击数据点后,每次都会向第二个图表发送新数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接