Fecha de la ultima revisión

#if(!require(devtools)) install.packages("devtools")
#devtools::install_github("dgrtwo/gganimate")
#devtools::install_github("yihui/animation")
#install.packages("rgl", dependencies=TRUE)

library(tidyverse)
library(gganimate)
library(rgl)
library(gapminder)
library(ggplot2)
library(animation)
library(gt)
library(datasets)
library(png)
library(gifski)

#install.packages("rgl", dependencies = TRUE)

El paquete gganimate extiende el paquete de ggplot2 y implementa unas funciones para animar gráficos que típicamente estuviese estática. El paquete fue desarrollado por Pedersen y Robinson (2017).Siempre puede ir al siguiente enlace para tener más información y otros ejemplos. https://gganimate.com/articles/gganimate.html. Note que antes de utilizar este modulo se asume que se conozca la estructura de la creación de gráficos con ggplot2.

Los datos provienen del paquete gapminder y el archivo gapminder. Estos datos representa la expectativa de supervivencia en diferentes 142 países entre 1952 y 2007. Aquí observamos las primeras 6 filas del archivo. Para facilitar el trabajo, reducimos el archivo a un subgrupo de años (1952 a 1962).

#gt(head(gapminder))
head(gapminder, n=20)
unique(gapminder$year)

gapminder2=gapminder %>% filter(year <1980)

Primero creamos un gráfico de puntos sin animación o sea estático. En el eje de X representa el GDP per capita en cada país, y en el eje de Y la supervivencia. El tamaño del punto es relativo el tamaño del país. La escala en el eje de X fue cambiado a una logarítmica usando scale_x_log10(). Aunque es difícil percibir la diferencia cada país tiene su proprio color.

p <- ggplot(
  gapminder2, 
  aes(x = gdpPercap, y = lifeExp, size = pop, colour = country)) +
  geom_point(show.legend = FALSE, alpha = 0.8) + 
  scale_size(range = c(.2, 12)) +
  scale_x_log10() +
  labs(x = "GDP per capita", y = "Expectativa de Vida")
p

Gráficos con animación:

Para incluir las transiciones en tiempo se usa la función transition_time. El largo de transición sera corresponde as la diferencia entre la variable de tiempo (en este casa “Time”).

La variable frame_time añade arriba una leyenda del tiempo de transición. Note que se usa la función labs y se añade el titulo y lo que hay entre los corchetes es la variable del cambio en tiempo.

#head(gapminder)
GDP_time=p + transition_time(year) +
 labs(title = "Año: {frame_time}")
GDP_time
animate(GDP_time, height = 300, width =300)
#anim_save("GDP_time.gif")

Crear facet animados.

Igual que para los gráficos de ggplot2 se puede crear una gráica por cada variable discreta. Para crear un gráfico por grupo y observar el de patrones de cambio en tiempo por continente se añade facet_wrap. En este próximo gráfico se produce un por cada continente.

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

Animación de los ejes: ejes variables

En este caso lo que observamos es que la leyenda en en x varia con los años, y la de y la dejamos fija. Si se usa view_follow(fixed_x = TRUE), la leyenda en y variaría con el cambio en GDP per capita y la de x seria fija. Si queremos que los dos ejes varían con los datos se usa view_follow(), sin poner nada dentro de los paréntesis.

p + transition_time(year) +
  labs(title = "Año: {frame_time}") +
  view_follow(fixed_x = TRUE)

Observar transiciones entre valores

La función shadow_wake es para representar un efecto de sobre o dirreccón por donde ocurre los cambios. Se puede seleccionar el tamaño de la disminución y la opacidad de la sombra. El largo de la cola no es

La duración de la estela no se da en cuadros absolutos, ya que eso haría que la animación sea susceptible a cambios en la velocidad de fotogramas. En cambio, se da por proporción de la longitud total de la animación. Por consecuencia el wake_length varia entre 0 a 1 en relación con el total de numero de periodo de tiempo (frames). En otra palabra más cerca el valor se acerca a 1, más largo sera la cola.

The length of the wake is not given in absolute frames as that would make the animation susceptible to changes in the framerate. Instead it is given as a proportion of the total length of the animation.


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

Visualizar los datos originales en el fondo

Con la función shadow_mark se puede ver los datos originales. Tanto los datos anteriores y futuros se pueden demostrar con diferentes estilos. Por ejemplo con el siguiente script shadow_mark(past = FALSE, future = TRUE) se observaría los datos futuros y no del pasado. El alternativa basica shadow_mark() es igual a shadow_mark(past = TRUE, future = FALSE)

final_animation = p + transition_time(year) +
  labs(title = "Year: {frame_time}") +
  shadow_mark(past=TRUE)

final_animation

Data from Covid-19

Located at https://ourworldindata.org/covid-deaths

  1. Ejercicio: Producir un gráfico con gganimate sobre el cambio de casos de COVID-19 en tiempo en diferentes paises
  • Seleccionar variables del archivo de covid-deaths que UD. le interesa con la función select() de tidyverse.
  • remover los NA
  • puede seleccionar un subgrupos de datos como de un continente solamente, o un subgrupo de paises
  • hacer un “facet_wrap” por continentes o otra variable
  • Puede cambiar el nombre de las leyenda en y y x.
  • Puede modificar el tamaño del punto que representa el paises por una variable.
library(readr)
library(readr)
owid_covid_data <- read_csv("COVID_DATA/owid-covid-data_2022.csv")
owid_covid_data

names(owid_covid_data)
library(tidyverse)
owid_covid_data2= owid_covid_data %>%
  select(date, location, total_deaths, 
         total_cases_per_million, continent, 
         total_deaths_per_million, population) %>%  # Seleccionar aquí sus variables del data frame
  drop_na() # remover los "NA". Esto remueve toda la fila si una de las variables tiene un "NA"
head(owid_covid_data2)  # Visualizar su nuevo data frame


unique(owid_covid_data2$continent)

Transiciones graduales

Con la función transition_reveal los datos aparece gradualmente en el gráfico

Usamos otro conjunto de datos del archivo airquality que se encuentra en el paquete datasets Primero creamos un gráfico estático (sin animación), el día del mes (day), la temperatura del día (Temp) y una linea para cada mes (mayo a septiembre) con la función group.

head(airquality)

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

Ahora animamos el gráfico en el eje de x con la variable de Day, añadiendo transition_reveal(Day)

p + transition_reveal(Day)
#final=p + transition_reveal(Day)
#anim_save("GDP_time4.gif")

Anadiendo un punto a la linea

Se puede añadir un punto al principio de las lineas

cambio_m=p + 
  geom_point() +
  transition_reveal(Day)
cambio_m
animate(cambio_m, height = 200, width =200)
# anim_save("cambio_m.gif")

Poniendo un punto por valor

Los puntos se pueden quedar en el gráfico añadiendo (group = seq_along(Day).

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

Animación con gráficos de barras

La transiciones también pueden ser producida con otros geoms por ejemplo con geom_col. El primer paso es tener un data frame que representa los valores de cada columna/barra. Entonces el primer paso aquí fue de calcular el promedio de temperatura por mes en un nuevo data frame que llamamos temp.promedio.

Preparación de los datos

head(airquality)
temp.promedio <- airquality %>%
  select(Month, Temp) %>% 
  group_by(Month) %>%
  summarise(Temp2 = mean(Temp, na.rm = TRUE))
temp.promedio

Gráfico de barra estático

Ahora creamos un gráfico estático de los datos con geom_col.

p <- ggplot(temp.promedio, aes(Month, Temp2, fill=Month)) +
  geom_col() +
  scale_fill_distiller(palette = "Blues", direction = 1) +
  theme_minimal() +
  theme(
    panel.grid = element_blank(),
    panel.grid.major.y = element_line(color = "white"),
    panel.ontop = TRUE
  )
p

Añadiendo efecto de transición en las columnas

El efecto de transición de un mes al otro se añade con la función transition_states(). Si uno añade solamente esta función aparece solamente una barra a la vez.

p + transition_states(Day, wrap = FALSE) 

Añadiendo efecto de transición y shadow

p + transition_states(Day, wrap = FALSE) +
  shadow_mark()

Para más ejemplos de como usar gganimate ver este enlace.

https://semba-blog.netlify.com/10/29/2018/animating-oceanographic-data-in-r-with-ggplot2-and-gganimate/