Data from #tidytuesday week of 2020-03-31 (source)
Load packages
library(tidyverse)
library(gganimate)
library(gifski)
Download data
beer_states_raw <- read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-03-31/beer_states.csv")
Clean data
beer_total <- beer_states_raw %>%
# FILL NULL VALUES WITH 0
replace(., is.na(.), 0) %>%
# REMOVE LINE ITEM FOR 'TOTAL'
filter(state != 'total') %>%
# COMPUTE TOTAL BARRELS PER YEAR BY STATE
group_by(year, state) %>%
summarize(total_barrels = sum(barrels)) %>%
ungroup()
Create rankings
beer_final <- beer_total %>%
group_by(year) %>%
mutate(
# CALCULATE RANKINGS BY TOTAL BARRELS PRODUCED EACH YEAR
rank = min_rank(-total_barrels) * 1.0,
# STATE TOTAL DIVIDE BY STATE RANKED #1 PER YEAR
produced = total_barrels / total_barrels[rank == 1],
# CLEANED TEXT LABEL
produced_label = paste0(" ", round(total_barrels / 1e6, 2), " M")) %>%
group_by(state) %>%
# SELECT TOP 20
filter(rank <= 20) %>%
ungroup()
Animate bar chart
p <- beer_final %>%
ggplot(aes(rank, produced, fill = state)) +
geom_col(show.legend = FALSE) +
geom_text(aes(rank, y = 0, label = state, hjust = 1.5)) +
geom_text(aes(rank, y = produced, label = produced_label, hjust = 0)) +
coord_flip() +
scale_x_reverse() +
theme_minimal(base_size = 15) +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank()) +
transition_time(year) +
labs(title = "US Beer Production by State",
subtitle = "Barrels produced each year: {round(frame_time)}",
caption = "by: @eeysirhc\nsource: Alcohol and Tobacco Tax and Trade Bureau",
x = NULL, y = NULL)
animate(p, nframes = 300, fps = 12,
width = 1000, height = 800, renderer = gifski_renderer())
Save .gif
Last but not least, don’t forget to save the file to your working directory:
anim_save("toast.gif")
Acknowledgements
- Thomas Lin Pedersen for the {gganimate} package
- The contributors to this StackOverflow answer