如何保存使用 gganimate 包创建的 gif 帧

How to save frames of gif created using gganimate package

我将以gapminder数据为例。假设我创建了这个动画:

library(gapminder)
library(ggplot2)
theme_set(theme_bw())
p <- ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop, color = 
continent, frame = year)) +
  geom_point() +
  scale_x_log10()

library(gganimate)

gganimate(p)

gganimate(p, "output.gif")

现在,我想访问构成 gif 的各个图像(帧)。有没有办法在 gganimate 中执行此操作,还是我需要使用动画包?

gganimate 自问这个问题以来已经发生了很大变化。在当前版本 (0.9.9.9999) 中,有一种方法可以将每个帧存储为自己的文件。

首先,我需要创建动画,它看起来与新版本的包有点不同:

p <- ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop, color = continent)) +
      geom_point() +
      scale_x_log10() +
      transition_states(year, 1, 5)

然后可以使用

显示动画
animate(p)

渲染由所谓的渲染器负责。要将动画存储在单个动画 gif 中,您可以使用

animate(p, nframes = 24, renderer = gifski_renderer("gganim.gif"))

请注意,我已手动设置要创建的帧数。默认情况下,使用 100 帧,我在这里选择了一个较小的数字。选择正确的帧数有时会有点棘手,如果您得到奇怪的结果,请尝试使用更多帧。

或者,您可以使用 file_renderer() 将每个帧写入其自己的文件

animate(p, nframes = 24, device = "png",
        renderer = file_renderer("~/gganim", prefix = "gganim_plot", overwrite = TRUE))

这会将名为 gganim_plot0001.pnggganim_plot0002.png 等的文件写入目录 ~/gganim。如果您想要不同的文件名或不同的文件类型,请修改 prefixdevice 的值。 (我将它们设置为默认值。)

@Stibu 的回答真好。这里有一些额外的提示:

为了更流畅的动画

  • nframes设置为动画中单个情节数量的倍数。例如,如果动画中有 52 个情节(一年中的每个星期一个),请尝试设置 nframes = (4 * 52)nframes = (6 * 52)

  • 尝试添加 enter_grow()exit_fade() 如果您还没有(它们可以添加到许多不带参数的动画中)

myanimation + 
  enter_grow() +
  exit_fade()

加速/减速

  • 如果您选择了高nframe,您的动画可能会很慢。您可以通过设置适当的 duration 更改动画的速度 ,例如
animate(myanimation, 
  nframes = 312, 
  renderer = gifski_renderer("new_users_weekly.gif"), 
  duration = 14) # Duration in seconds

在 RMarkdown(或其他网页)中使用保存的 gif

插入由

产生的 .gif
animate(myanimation, renderer = gifski_renderer("new_users_weekly.gif")

进入网页或 RMarkdown 只需简单地完成:

<img src="new_users_weekly.gif" alt="animation"/>

更多信息

https://cran.r-project.org/web/packages/gganimate/gganimate.pdf#page=4