【问题标题】:gganimate plot where points stay and line fadesgganimate 点停留和线条消失的情节
【发布时间】:2020-02-04 20:30:01
【问题描述】:

这是一个静态图的可重现示例,我想对其进行动画处理(我想展示 MCMC 采样器的行为方式)。

library(tidyverse)
library(gganimate)

set.seed(1234)
plot_data <- tibble(x=cumsum(rnorm(100)),
                    y=cumsum(rnorm(100)),
                    time=1:length(x)) 

ggplot(data=plot_data,
       aes(x=y, y=x)) +
  geom_point() + geom_line()

我希望看到的是点在绘制后是可见的并且之后有点褪色(即 alpha 从例如 1 变为 0.3),而会有一条线只显示最近的历史(理想情况下)褪色显示最近的历史,褪色最少,退后几步完全消失)。

以下内容或多或少地实现了我想要的点(所以从某种意义上说,我只想在连接最后几个点的地方添加渐变线 - 在某些帧上渐变得更慢的点会更好):

ggplot(data=plot_data,
       aes(x=y, y=x)) +
  geom_point() +
  transition_time(time) +
  shadow_mark(past = T, future=F, alpha=0.3)

我正在苦苦挣扎的是如何为两个几何添加两种不同的行为,例如点和线。例如。在下面,点消失(我不希望它们消失)并且线条不会消失(我希望它们消失)。

p <- ggplot(data=plot_data,
       aes(x=y, y=x)) +
  geom_point() +
  transition_time(time) +
  shadow_mark(past = T, future=F, alpha=0.3)

p + geom_line() +
  transition_reveal(along = time) +
  shadow_mark(past = T, future=F, alpha=0.3) 

【问题讨论】:

    标签: r animation ggplot2 gganimate


    【解决方案1】:

    我无法使用内置的shadow_* 函数一次控制多个行为;它似乎只是应用最近的一个。 (使用 gganimate 1.0.3.9000)

    解决此问题的一种方法是手动计算转换。例如,我们可以复制数据 100 次,每帧复制一份,然后分别指定点层的 alpha 和分段层的 alpha。

    plot_data %>%
      uncount(100, .id = "frame") %>%
      filter(time <= frame) %>%
      arrange(frame, time) %>%
      group_by(frame) %>%
      mutate(x_lag = lag(x), 
             y_lag = lag(y),
             tail = last(time) - time,
             # Make the points solid for 1 frame then alpha 0.3
             point_alpha = if_else(tail == 0, 1, 0.3),
             # Make the lines fade out over 20 frames
             segment_alpha = pmax(0, (20-tail)/20)) %>%
      ungroup() %>%
    
      ggplot(aes(x=y, y=x, xend = y_lag, yend = x_lag, group = time)) +
      geom_segment(aes(alpha = segment_alpha)) +
      geom_point(aes(alpha = point_alpha)) +
      scale_alpha(range = c(0,1)) +
      guides(alpha = F) +
      transition_manual(frame)
    

    (对于这个渲染,我用animate( [everything above], width = 600, height = 400, type = "cairo")包裹它)

    【讨论】:

    • 非常感谢。您的答案中有一个小问题:point_alpha=... & segment_alpha=... 需要在 mutate(...) 内。相应地修改了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 2020-09-20
    • 2015-09-23
    • 2016-11-17
    • 1970-01-01
    相关资源
    最近更新 更多