The gganimate
package in R is
an extension of the ggplot2
package, designed to create animated
visualizations.
This post showcases the key
features of gganimate
and provides a set of
animated graph examples using the package.
{gganimate}
The gganimate
package in R is an extension of the ggplot2
package, designed to create animated and interactive
visualizations.
It offers a set of grammar extensions that make it easy to specify animations in a declarative manner.
βοΈ author β Thomas Lin Pedersen
π documentation β gganimate.com
βοΈ more than 2000 stars on github
To get started with gganimate
, you can install it
directly from CRAN using the install.packages
function:
The gganimate
package extends the grammar of graphics to
include the description of animation. You start with a regular ggplot2
plot and add animation-specific layers to it.
Hereβs a basic example where the year
variable is used
to animate the plot:
library(ggplot2)
library(gganimate)
library(gapminder)
p <- ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop, colour = country)) +
geom_point(alpha = 0.7, show.legend = FALSE) +
scale_colour_manual(values = country_colors) +
scale_size(range = c(2, 12)) +
scale_x_log10() +
labs(title = "Year: {frame_time}", x = "GDP per capita", y = "life expectancy")
anim <- p + transition_time(year) +
ease_aes("linear")
anim_save("../img/graph/gganimate-1.gif", anim)
Transitions allow you to animate changes in your data over time or between different states.
This animation transitions between different gears (3, 4, and 5). The
transition_states()
function creates smooth transitions
between these discrete states. Points fade in and out
as they enter or exit each state.
library(ggplot2)
library(gganimate)
# Create a basic scatter plot
p <- ggplot(mtcars, aes(x = wt, y = mpg, color = factor(cyl))) +
geom_point(size = 3) +
labs(
title = "Car Weight vs MPG",
subtitle = "Gear: {closest_state}",
x = "Weight (1000 lbs)", y = "Miles per Gallon"
)
# Add animation
anim <- p +
transition_states(gear,
transition_length = 2,
state_length = 1
) +
enter_fade() +
exit_fade()
anim_save("../img/graph/gganimate-2.gif", anim)
Tweening interpolates between different aesthetic values to create smooth animations over continuous variables.
This animation shows how life expectancy, GDP per capita, and
population have changed over time for different countries. The
transition_time()
function creates a smooth animation over
the years, with the points moving to their new
positions each year.
library(ggplot2)
library(gganimate)
library(gapminder)
# Create a basic scatter plot
p <- ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop, color = continent)) +
geom_point(alpha = 0.7) +
scale_color_viridis_d() +
scale_size(range = c(2, 12)) +
scale_x_log10() +
labs(
title = "Year: {frame_time}",
x = "GDP per capita",
y = "Life expectancy"
)
# Add animation
anim <- p +
transition_time(year) +
ease_aes("linear")
anim_save("../img/graph/gganimate-3.gif", anim)
You can control how data points appear and disappear during transitions.
This animation shows the average MPG for cars with different numbers
of cylinders. The enter_grow()
function makes new
bars grow from the bottom, while exit_shrink()
makes disappearing bars shrink down.
library(ggplot2)
library(gganimate)
library(dplyr)
# Prepare data
data <- mtcars %>%
mutate(cyl = factor(cyl)) %>%
group_by(cyl) %>%
summarize(mpg = mean(mpg))
# Create a basic bar plot
p <- ggplot(data, aes(x = cyl, y = mpg, fill = cyl)) +
geom_col() +
labs(
title = "Average MPG by Number of Cylinders",
subtitle = "Showing: {closest_state}",
x = "Number of Cylinders",
y = "Average Miles per Gallon"
)
# Add animation
anim <- p +
transition_states(cyl) +
enter_grow() +
exit_shrink()
anim_save("../img/graph/gganimate-4.gif", anim)
The gallery is filled with gganimate
examples that
showcase the power and flexibility of the package. Each
example includes a brief explanation and a link to the full code!
π After crafting hundreds of R charts over 12 years, I've distilled my top 10 tips and tricks. Receive them via email! One insight per day for the next 10 days! π₯