You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于ID与时间的gganimate动画:实现逐参与者前后轨迹展示

解决方案

要实现你需要的动画效果,核心是给每个参与者的Before/After阶段分配递进的时间节点,让每个参与者先显示Before点,再完成到After的线条过渡,同时保留逐参与者展示的效果。以下是具体步骤和代码:

数据预处理

先给数据集添加自定义的anim_time变量,每个参与者的Before阶段对应奇数时间,After阶段对应偶数时间,既保证每个参与者的Before先出现,又能按参与者顺序递进:

library(dplyr)

df <- df %>%
  group_by(participant) %>%
  mutate(anim_time = case_when(
    prepost == "Before" ~ participant * 2 - 1,
    prepost == "After" ~ participant * 2
  )) %>%
  ungroup()

动画代码实现

结合transition_time()和transition_reveal(),配合shadow_mark()实现需求效果:

library(ggplot2)
library(gganimate)
library(transformr)

anim <- df %>%
  ggplot(aes(x = factor(prepost, levels = c("Before", "After")), y = value)) +
  geom_point(aes(group = participant), size = 2) +
  geom_line(aes(group = participant), size = 0.8) +
  scale_y_continuous(breaks = seq(10, 50, 5)) +
  facet_wrap(~factor(group, levels = c("Positive", "Negative")), ncol = 2) +
  # 按自定义时间节点控制整体出现顺序
  transition_time(anim_time) +
  # 保留已出现的参与者标记
  shadow_mark(past = TRUE, future = FALSE, size = 0.2, alpha = 0.1) +
  # 实现线条从Before到After的绘制动画
  transition_reveal(anim_time)

# 调整帧率和时长优化动画节奏
animate(anim, fps = 5, duration = 15, renderer = gifski_renderer())

效果说明

  • 每个参与者会先在Before位置显示数据点,随后线条逐步绘制到After位置;
  • 新参与者的动画会在前一个参与者完成过渡后启动;
  • shadow_mark保留所有已出现的参与者,维持逐参与者展示且保留历史的效果。

内容的提问来源于stack exchange,提问作者Myscellia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:05:26