【问题标题】:How to control appearance of flashing dots in gganimate如何控制gganimate中闪烁点的出现
【发布时间】:2020-02-19 20:01:14
【问题描述】:

假设我有这些数据,我想用ggplot2+gganimate 制作动画。

library(ggplot2)
library(gganimate)

data <- data.frame(day = c(1:5, 1:5), 
    x = c(rep(2,5), rep(4, 5)), 
    y=c(rep(1, 5), rep(2, 5)))

data <- data[c(1:2, 4:10),]

动画/问题的目标是

没有。 1. 数据集中的每一天+x+y 点都有闪烁的红点(意味着那一天+x+y 有一个观察值)。闪光应该非常简短。在它闪烁之后,它应该变成黑色的背景颜色(由shadow_mark控制)。请注意,我不希望点四处飘荡,只停留在它们所在的位置(请参阅此问题的解决方案:How to make dots in gganimate appear and not transition)。

没有。 2. 我还希望这些点在他们的一天开始时开始闪烁。这是我想要的部分代码,但未能(完全)解决数字 1 和 2:

ggplot(data, aes(x,y, group=interaction(x,y))) +
    geom_point(color="red", size=3) +
    transition_time(day) +
    shadow_mark(color="black", size=3) +
    theme(plot.subtitle = element_text(hjust = 0.7)) +      
    labs(subtitle = paste('day: {frame_time}'))  -> a

anim_save("test.gif", a, end_pause=6, width = 400, height = 450, duration=15)

这是生成的动画:

这有两个问题我希望得到解决:

  1. 这些点不仅会瞬间闪烁,而且会闪烁太久。换句话说,我想简单地看到一个红点,然后是黑点,然后是红点,等等。
  2. 闪光灯开始的时间也有问题。如预期的那样,当点变为黑色时(因为data 缺少 (x=2,y=1) 点的第 3 天),就说明了这一点。然而,它在第 3 天中途变成黑色,并在第 4 天中途变回红色,但我希望它在第 3 天开始时准确地变成黑色,并在第 4 天开始时准确地闪烁红色。请注意,我不确定这次时间错位是由 transition_time 行为还是字幕 frame_time 行为或其他原因引起的。

有什么建议吗?

【问题讨论】:

  • 您希望这些点持续存在的时间超过它们开始的那一天吗?
  • 是的。在我的实际应用程序中,我希望点在它们出现的那一天闪烁(类似于您的答案中闪烁的红色),然后持续存在(相当于黑色),但实际上使用 0.1 的 alpha。这样一天出现第一次时,黑点会是浅灰色,第二次会变暗一点,以此类推。

标签: r animation ggplot2 plot gganimate


【解决方案1】:

这是一种方法,其中数据被准备为每天提供 25 帧,其中颜色仅针对其中的第一帧进行闪烁:

library(dplyr); library(tidyr)
f_per_day <- 25
animate(
  data %>%
    uncount(f_per_day, .id = "frame") %>%
    mutate(time = day + (frame-1)/f_per_day) %>%

    ggplot(aes(x, y, color = frame == 1)) +
    geom_point(size = 3) +
    scale_color_manual(values = c("black", "red"), guide = F) +
    theme(plot.subtitle = element_text(hjust = 0.7)) +      
    labs(subtitle = paste('day: {floor(frame_time*10)/10}')) +
    transition_time(time),

  width = 400, 
  height = 450, 
  fps = 25, 
  type = "cairo")

【讨论】:

  • 谢谢!如果您不介意快速跟进问题,您的哪一方面代码解决了问题 2?另外,我计划稍后在可能的时候奖励你;由于某种原因,我必须等待一段时间。
  • 我认为过渡在旧数据中过早地发生了,因为 gganimate 正在提取当时最接近的颜色值,并且您的原始数据是当天的粒度。因此,在一天中的某个时间点“3.5”,它将变为 4 值。如果数据具有与帧速率相同的粒度,则通过为其提供更多帧,可以减少或完全消除该问题。
  • 非常有趣。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 2023-04-10
  • 2022-11-04
  • 2023-03-28
  • 2020-05-05
  • 1970-01-01
  • 2016-04-16
相关资源
最近更新 更多