Можно ли согласовать анимацию на 2 сюжетах с gganimate - PullRequest
0 голосов
/ 07 ноября 2019

Мне бы хотелось иметь 2 анимированных сюжета с синхронизацией. Так что, возможно, у меня есть набор данных с 3 столбцами (время, x и y), и по мере продвижения по времени график для x и график для y перемещаются в пошаговом режиме. Кроме того, я хотел бы, чтобы это было в приложении R-Shiny, с кнопкой, называемой «сделать шаг», которая управляет анимацией. Я надеялся использовать gganimate, и тогда все, что мне нужно, это способ установить отображаемый в данный момент кадр. Это возможно?

Большое спасибо,

1 Ответ

1 голос
/ 07 ноября 2019

Нечто подобное может работать. Мониторинг кнопки Make a step с помощью reactiveVal для обновления набора данных и повторной визуализации графиков.

library(shiny)
library(ggplot2)

dd  <- tibble(Time = 1:10,
              x = 1:10,
              y = 1:10*10)

ui <- basicPage(column(1, actionButton("make_a_step", "Make a step")),
                column(4, plotOutput("p1")),
                column(4, plotOutput("p2")))

server <- function(input, output) {
  n_steps <- reactiveVal(value = 0)

  observeEvent(input$make_a_step,{
    new_steps <- n_steps() + 1
    n_steps(new_steps)
  })

  plot_fun <- function(df, x_or_y) {
    ggplot(df, aes(x = "Time", y = !!as.name(x_or_y))) + geom_point()
  }

  sub_fun <- function(steps) {
    validate(need(steps <= 10, "You've reached the last time point"))
    dd[1:steps,]
  }

  output$p1 <- renderPlot({
    plot_fun(sub_fun(n_steps()), "x")
  })

  output$p2 <- renderPlot({
    plot_fun(sub_fun(n_steps()), "y")
  })

}

runApp(list(ui = ui, server = server))
...