Это сравнительно ручной подход, который основывается на предварительной подготовке большего количества и подаче этого в gganimate
. Я хотел бы посмотреть, есть ли более простой способ сделать это внутри gganimate
более автоматически.
Сначала я делаю копию кадра данных для каждого кадра, который я хочу показать. Затем я вычисляю разницу между временем, которое я сейчас просматриваю (time
), и t
, когда я хочу показать каждую точку данных. Я использую cos
, чтобы справиться с замедлением, чтобы появление каждой точки в данный момент времени описывалось display
. В вызове ggplot я затем отображаю альфа и размер на display
и использую transition_time(time)
для перемещения по кадрам.
# Create prep table
fade_time = 1
frame_count = 100
frames_per_time = 10
df2 <- map_df(seq_len(frame_count), ~df, .id = "time") %>%
mutate(time = as.numeric(time)/frames_per_time,
delta_norm = (t - time) / fade_time,
display = if_else(abs(delta_norm) > 1, 0, cos(pi / 2 * delta_norm)))
# Create animation
g <- ggplot(df2, aes(x = x, y = y, alpha = display, size = display))
g <- g + geom_point(colour = "#FF3300", shape = 19)
g <- g + scale_alpha(range = c(0, 1)) + scale_size_area(max_size = 5)
g <- g + labs(title = "{round(frame_time, 1)}")
g <- g + transition_time(time)
animate(g)