Search code examples
rggplot2plotlyr-plotly

Equivalent of gganimate::transition_events on plotly


In R, using gganimate, one can make an animated plot where events appear and disappear with time. For example:

library(lubridate)
library(gganimate)

df=data.frame(
x=c(1,2,3,4),
y=c(1,2,3,4),
start=c(1,2,3,4),
end=c(5,6,7,8),
en=as_date(1),
ex=as_date(1))

ggplot(data=df, aes(x=x,y=y))+
  geom_point()+
  gganimate::transition_events(
     start=start, 
     end=end, 
     enter_length = as.numeric(en), 
     exit_length = as.numeric(ex))

This produces a plot in which points appear according to column "start" and desappear according to column "end".

I wonder if there is an easy way to achieve the same in with plotly (preferably using ggplotly()), getting a slider to move along the time.


Solution

  • Here is an example using ggplotly. The result however isn't exactly the same:

    library(plotly)
    library(lubridate)
    
    df = data.frame(
      x = c(1, 2, 3, 4),
      y = c(1, 2, 3, 4),
      start = c(1, 2, 3, 4),
      end = c(5, 6, 7, 8),
      en = as_date(1),
      ex = as_date(1)
    )
    
    frame_list <- Map(seq, from = df$start, to = df$end)
    DF <- data.frame(x = rep(df$x, times = lengths(frame_list)),
                     y = rep(df$y, times = lengths(frame_list)),
                     frame = unlist(frame_list))
    
    p <- ggplot(DF, aes(x, y)) +
      geom_point(aes(size = y, frame = frame))
    
    fig <- ggplotly(p)
    
    fig %>%
      animation_opts(
        frame = 0,
        easing = "linear",
        redraw = FALSE,
        mode = "immediate"
      )
    fig
    

    result