Измените пределы для графика на клике в другом графике в R - PullRequest
0 голосов
/ 04 сентября 2018

Мне нужно отобразить два графика. Первый график является основным точечным графиком. И второй график должен быть изменен каждый раз, когда кто-то щелкает точку на первом графике. Поэтому мне нужно поведение, подобное изображению на https://davidgohel.github.io/ggiraph/index.html

Чтобы быть более точным, каждая точка первого графика должна быть связана с x-пределами второго графика.

Я нашел соответствующий пример Как отобразить много точек из plotly_click в 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-пределы?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Это не совсем то, что вы просили, но ...

Мы можем построить сюжетный объект с ползунком по оси 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()
0 голосов
/ 11 сентября 2018

Похоже, что обойти это невозможно, поскольку каждое изменение / запрос на графике подразумевает повторный рендеринг графика, поскольку Shiny отправляет новые данные на второй график каждый раз, когда щелкает точка данных на первый график.

...