library(plotly)
## Warning: package 'plotly' was built under R version 4.4.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.4.3
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
p <- ggplot(msleep, aes(brainwt, sleep_total, color = vore, 
                        genus = genus, 
                        conservation = conservation)) +
  geom_point() +
  scale_x_log10()
ggplotly(p)
library(lubridate)
## Warning: package 'lubridate' was built under R version 4.4.3
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(gganimate)
## Warning: package 'gganimate' was built under R version 4.4.3
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))

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))
## Warning in geom_point(aes(size = y, frame = frame)): Ignoring unknown
## aesthetics: frame
fig <- ggplotly(p)

fig %>%
  animation_opts(
    frame = 0,
    easing = "linear",
    redraw = FALSE,
    mode = "immediate"
  )
fig