6

我开始熟悉gganimategif,但我想进一步扩展我的 gif。

例如,我可以frame在一个变量中添加一个变量,gganimate但如果我想为添加全新层/几何/变量的过程设置动画怎么办?

这是一个标准gganimate示例:

library(tidyverse)
library(gganimate)

p <- ggplot(mtcars, aes(x = hp, y = mpg, frame = cyl)) +
    geom_point()

gg_animate(p)

但是,如果我想要 gif 动画怎么办:

# frame 1
ggplot(mtcars, aes(x = hp, y = mpg)) +
    geom_point()

# frame 2
ggplot(mtcars, aes(x = hp, y = mpg)) +
    geom_point(aes(color = factor(cyl)))

# frame 3
ggplot(mtcars, aes(x = hp, y = mpg)) +
    geom_point(aes(color = factor(cyl), size = wt))

# frame 4
ggplot(mtcars, aes(x = hp, y = mpg)) +
    geom_point(aes(color = factor(cyl), size = wt)) +
    labs(title = "MTCARS")

这怎么可能实现?

4

3 回答 3

8

您可以手动frame为每一层添加美学,尽管它会立即包含所有帧的图例(我相信,故意保持比率/边距等正确:

saveAnimate <-
  ggplot(mtcars, aes(x = hp, y = mpg)) +
  # frame 1
  geom_point(aes(frame = 1)) +
  # frame 2
  geom_point(aes(color = factor(cyl)
                 , frame = 2)
             ) +
  # frame 3
  geom_point(aes(color = factor(cyl), size = wt
                 , frame = 3)) +
  # frame 4
  geom_point(aes(color = factor(cyl), size = wt
                 , frame = 4)) +
  # I don't think I can add this one
  labs(title = "MTCARS")

gg_animate(saveAnimate)

在此处输入图像描述

如果您希望能够自己添加内容,甚至查看图例、标题等如何移动内容,您可能需要退回到较低级别的包,并自己构建图像。在这里,我使用的animation包允许您循环浏览一系列情节,没有任何限制(它们根本不需要相关,所以当然可以显示移动情节区域的东西。请注意,我相信这需要 ImageMagick安装在您的计算机上。

p <- ggplot(mtcars, aes(x = hp, y = mpg))

toSave <- list(
  p + geom_point()
  , p + geom_point(aes(color = factor(cyl)))
  , p + geom_point(aes(color = factor(cyl), size = wt))
  , p + geom_point(aes(color = factor(cyl), size = wt)) +
    labs(title = "MTCARS")
)

library(animation)

saveGIF(
  {lapply(toSave, print)}
  , "animationTest.gif"
 )

在此处输入图像描述

于 2016-10-06T16:24:05.277 回答
2

早期答案中的gganimate命令自 2021 年起已弃用,并且不会完成 OP 的任务。

基于 Mark 的代码,您现在可以简单地创建具有多个分层几何图形的静态 ggplot 对象,然后添加该gganimate::transition_layers函数以创建在静态图中从层到层转换的动画。补间函数类似于enter_fade()enter_grow()控制元素如何进出框架。

library(tidyverse)
library(gganimate)

anim <- ggplot(mtcars, aes(x = hp, y = mpg)) +
  # Title
  labs(title = "MTCARS") +
  # Frame 1
  geom_point() +
  # Frame 2  
  geom_point(aes(color = factor(cyl))) +
  # Frame 3
  geom_point(aes(color = factor(cyl), size = wt)) +
  # gganimate functions
  transition_layers() + enter_fade() + enter_grow()

# Render animation
animate(anim)

于 2021-01-26T20:26:39.343 回答
0

animation包不会强制您在数据中指定帧。请在此处查看本页底部的示例,其中动画被包装在一个大saveGIF()函数中。您可以指定单个帧和所有内容的持续时间。

这样做的缺点是,与漂亮的 gganimate 函数不同,基本的逐帧动画不会保持绘图尺寸/图例不变。但是,如果您可以破解自己的方式来准确显示每一帧所需的内容,那么基本的动画包将为您提供很好的服务。

于 2016-10-07T07:01:06.370 回答