2016-10-06 3 views
3

Я начинаю знаком с gganimate, но я хочу расширить свои gifs дальше.Анимировать процесс добавления слоев в график ggplot2

Например, я могу выбросить 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") 

Как это может быть достигнуто?

ответ

5

Вы можете вручную добавить 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) 

enter image description here

Если вы хотите иметь возможность добавлять вещи сами и даже видеть, как легенды, заголовки и т. Д. Перемещают вещи, вам может потребоваться вернуться к пакету более низкого уровня и самостоятельно создать изображения. , Я использую пакет animation, который позволяет вам перебирать серию сюжетов, остроумие h никаких ограничений (они не должны быть связаны вообще, поэтому, безусловно, можно показать, что перемещает область сюжета. Обратите внимание: я считаю, что для этого необходимо установить 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" 
) 

enter image description here

+0

Pretty slick. Я не думаю, что когда-либо видел анимированный дисплей на SO раньше. Я думал, что SO только отображает png-файлы. Теперь нам просто нужно замедлить биттон, но это может быть еще один вопрос. –

+0

Справка для 'saveGIF' указывает на' ani.options', который включает 'interval', который устанавливает время, в течение которого каждый кадр остается (в секундах). Итак, просто добавив 'interval = 3', вы получите 3 секунды за фрейм. –

+0

Fo. В какой-то момент вы должны добавить код для хранения легенд в фиксированном формате, но это впечатление исчезло по мере обновления страницы. О, никогда, ум ... верхний имеет эту особенность, а нижняя - нет. –

0

animation пакет не заставит вас указать кадров в данных. См. Пример в нижней части этой страницы here, где анимация завернута в большую функцию saveGIF(). Вы можете указать продолжительность отдельных кадров и всего.

Недостатком этого является то, что в отличие от приятных функций gganimate базовая анимация кадр за кадром не удерживает размеры графика/константу легенды. Но если вы можете взломать свой путь в отображении именно того, что вы хотите для каждого фрейма, базовый пакет анимации послужит вам хорошо.