更改R中另一个绘图中单击的绘图限制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更改R中另一个绘图中单击的绘图限制相关的知识,希望对你有一定的参考价值。

我需要显示两个图。第一个图是主散点图。每次点击第一个图中的一个点时,必须更改第二个图。所以我需要类似于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限制?

答案

似乎没有办法解决这个问题,因为图中的每个更改/查询都意味着重新呈现图表,因为Shiny每次在第一个图表上点击数据点时都会将新数据发送到第二个图表。

另一答案

这不完全是你问的,但......

我们可以在其中构建一个带有x轴滑块的绘图对象。重绘不是即时的,但它比每次想要更改范围时重新加载数据子集要快得多。

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()

以上是关于更改R中另一个绘图中单击的绘图限制的主要内容,如果未能解决你的问题,请参考以下文章

降低绘图循环的速度以查看 R 中的运动(无需单击)

更改绘图热图中的颜色条标签 (R)

R:更改绘图大小

在 R 闪亮中,如何指定用于绘图的反应对象列?

更改绘图表达树状图的悬停文本

在 R Shiny 中,如何为反应对象渲染绘图?