Veremos la creación de animaciones usando la librería gganimate.

gganimate es una extensión de ggplot2 para la creación de grÔficos animados a partir de un grÔfico de ggplot. Este paquete nos proporciona nuevas funciones que nos permiten personalizar el cambio en el tiempo.

Las instrucciones mas relevantes son:

library(gapminder)
library(gganimate)
library(gifski)
library(tidyverse)

PARTE 1

Grafico usando ggplot

Utilizamos los datos de gapminder

?gapminder
head(gapminder)
## # A tibble: 6 x 6
##   country     continent  year lifeExp      pop gdpPercap
##   <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
## 1 Afghanistan Asia       1952    28.8  8425333      779.
## 2 Afghanistan Asia       1957    30.3  9240934      821.
## 3 Afghanistan Asia       1962    32.0 10267083      853.
## 4 Afghanistan Asia       1967    34.0 11537966      836.
## 5 Afghanistan Asia       1972    36.1 13079460      740.
## 6 Afghanistan Asia       1977    38.4 14880372      786.
ggplot(gapminder,aes(x = gdpPercap, y=lifeExp, size = pop, colour = country))+
  geom_point(show.legend = FALSE, alpha = 0.7)

p<-ggplot(gapminder,aes(x = gdpPercap, y=lifeExp, size = pop, colour = country))+
  geom_point(show.legend = FALSE, alpha = 0.7)
p

p<- p +
  scale_color_viridis_d() +
  scale_size(range = c(2, 12)) +
  scale_x_log10() +
  labs(x = "GDP per capita", y = "Life expectancy")
p

Primer grƔfico animado

?transition_time
p + transition_time(year) +
  labs(title = "Year: {frame_time}")

Agregamos una nueva capa al grƔfico en ggplot

p + transition_time(year) +
  labs(title = "Year: {frame_time}") + 
  facet_wrap(~continent)

Efecto con sombras

p + transition_time(year) +
  labs(title = "Year: {frame_time}") +
  shadow_wake(wake_length = 0.1, alpha = FALSE)

Mostrar los datos anteriores

Muestra la sombra de la fotografĆ­a anterior

p + transition_time(year) +
  labs(title = "Year: {frame_time}") +
  shadow_mark(alpha = 0.3, size = 0.5)

TambiƩn podemos mostrar es la expectativa de vida promedio para cada continente en cada aƱo. Para esto utilizamos la sintƔxis de tidyverse para agrupar por aƱo y continente. Luego calculamos la expectativa de vida promedio y realizamos nuestro grƔfico animado.

?transition_reveal
p<- gapminder %>% group_by(year, continent) %>% 
  summarize(mean_life = mean(lifeExp)) %>% 
  ggplot(aes(x=year, y = mean_life, color = continent))+geom_line()+ 
  transition_reveal(year)
p

¿Cómo guardamos nuestras animaciones?

La función toma el grĆ”fico definido en el objeto p como argumento de entrada y realiza la representación de la animación. Es lo mismo que ā€œimprimirā€ la animación.

animate(p)

La función permite guardar la trama animada renderizada en un archivo .GIF

anim_save('plot_gdpPercap_lifeExp.gif')

Otra opción

b <- animate(p, duration = 20, fps = 20, renderer = av_renderer())
b
anim_save("output", b)

PARTE 2

Ejemplo de animación con línea en el tiempo

Utilizamos la base de datos ā€œairqualityā€ que corresponde a un data set base de R

Primero graficamos nuestro modelo inicial

p <- ggplot(
  airquality,
  aes(Day, Temp, group = Month, color = factor(Month))) +
  geom_line() +
  scale_color_viridis_d() +
  labs(x = "Day of Month", y = "Temperature") +
  theme(legend.position = "top")
p

Agregamos animaciones con transition_reveal

p + transition_reveal(Day)

Podemos agregar puntos en nuestro grƔfico

p + geom_point() +
  transition_reveal(Day)

Podemos mantener esos puntos en nuestro grƔfico

p + geom_point(aes(group = seq_along(Day))) +
  transition_reveal(Day)

PARTE 3

Ahora veremos las animaciones, pero sin considerar la variable de tiempo.

?iris
head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
p <- ggplot(iris, aes(x = Petal.Width, y = Petal.Length)) + 
  geom_point()

plot(p)

Agregamos la animación

?transition_states # Divide los datos del objeto por una variable discreta y anima entre los diferentes estados
p <- p +
  transition_states(Species,
                    transition_length = 2,
                    state_length = 1)
p  

Cuando utilizamos transition_states se necesita decidir cómo debe progresar el cambio de un valor a otro. La suavización predeterminada es lineal, pero se pueden usar otras, potencialmente solo dirigidas a estéticas específicas

p + ease_aes('cubic-in-out')

p + ease_aes(y = 'bounce-out')

Sabemos que hay 3 tipos de especie, por lo tanto nuestra animación puede mostrar cómo es la relación entre el largo y el ancho de los pétalos para cada tipo de especie

Primera opción

ggplot(iris, aes(x = Petal.Width, y = Petal.Length)) + 
  geom_point(aes(colour = Species)) + 
  transition_states(Species,
                    transition_length = 2,
                    state_length = 1)

Segunda opción

p + ggtitle('Now showing {closest_state}',
        subtitle = 'Frame {frame} of {nframes}')

Entrada y salida

Las funciones se utilizan para modificar la estƩtica de los datos que aparecen y desaparecen para que su entrada o salida pueda ser animada.

anim <- ggplot(iris, aes(x = Petal.Width, y = Petal.Length)) + 
  geom_point(aes(colour = Species), size = 2) + 
  transition_states(Species,
                    transition_length = 2,
                    state_length = 1)
anim

anim + 
  enter_fade() + 
  exit_shrink()