Creating Animated Bar Charts with R

Creating Animated Bar Charts with R

Animated bar charts that can be embedded directly into a post on any website are becoming more and more popular. They display the dynamics of changes in any characteristics over a certain time and do it visually. Let's see how to create them using R and generic packages.

Skillbox recommends: Practical course "Python developer from scratch".

We remind you: for all readers of "Habr" - a discount of 10 rubles when enrolling in any Skillbox course using the "Habr" promotional code.

Plans for

We need packages in R:

These two are essential. In addition, tidyverse, janitor, and scales will be required for data manipulation, array cleanup, and formatting, respectively.

Data

The original dataset that we will be using in this project is downloaded from the World Bank website. Here they are - World Bank Data. The same data, if you need it ready-made, can be downloaded from project folders.

What is this information? The sample contains the value of the GDP of most countries for several years (from 2000 to 2017).

Data processing

We will use the code below to prepare the required data format. We clean up the column names, turn the numbers into a number format, and convert the data using the gather() function. Everything that is received is saved in gdp_tidy.csv for further use.

library(tidyverse)
library(janitor)

gdp <- read_csv("./data/GDP_Data.csv")

#select required columns

gdp <- gdp %>% select(3:15)

#filter only country rows

gdp <- gdp[1:217,]

gdp_tidy <- gdp %>%
mutate_at(vars(contains("YR")),as.numeric) %>%
gather(year,value,3:13) %>%
janitor::clean_names() %>%
mutate(year = as.numeric(stringr::str_sub(year,1,4)))

write_csv(gdp_tidy,"./data/gdp_tidy.csv")

Animated bar graphs

Their creation requires two steps:

  • Building a complete set of actual histograms using ggplot2.
  • Animate static histograms with desired parameters using gganimate.

The final step is to render the animation in the desired format, including GIF or MP4.

Loading Libraries

  • library(tidyverse)
  • library(ganimate)

Data management

In this step, you need to filter the data to get the top 10 countries each year. Let's add some columns that will allow us to display the legend for the histogram.

gdp_tidy <- read_csv("./data/gdp_tidy.csv")

gdp_formatted <- gdp_tidy %>%
group_by(year) %>%
# The * 1 makes it possible to have non-integer ranks while sliding
mutate(rank = rank(-value),
Value_rel = value/value[rank==1],
Value_lbl = paste0(" ",round(value/1e9))) %>%
group_by(country_name) %>%
filter(rank <=10) %>%
ungroup()

Building static histograms

Now that we have a batch of data in the right format, we start drawing static histograms. Basic information - top 10 countries with the maximum GDP for the selected time interval. Graphs are built for each year.

staticplot = ggplot(gdp_formatted, aes(rank, group = country_name,
fill = as.factor(country_name), color = as.factor(country_name))) +
geom_tile(aes(y = value/2,
height = value,
width = 0.9), alpha = 0.8, color = NA) +
geom_text(aes(y = 0, label = paste(country_name, " ")), vjust = 0.2, hjust = 1) +
geom_text(aes(y=value,label = Value_lbl, hjust=0)) +
coord_flip(clip = "off", expand = FALSE) +
scale_y_continuous(labels = scales::comma) +
scale_x_reverse() +
guides(color = FALSE, fill = FALSE) +
theme(axis.line=element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
legend.position="none",
panel.background=element_blank(),
panel.border=element_blank(),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
panel.grid.major.x = element_line( size=.1, color="grey" ),
panel.grid.minor.x = element_line( size=.1, color="grey" ),
plot.title=element_text(size=25, hjust=0.5, face="bold", colour="grey", vjust=-1),
plot.subtitle=element_text(size=18, hjust=0.5, face="italic", color="grey"),
plot.caption =element_text(size=8, hjust=0.5, face="italic", color="grey"),
plot.background=element_blank(),
plot.margin = margin(2,2, 2, 4, "cm"))

Plotting with ggplot2 is very easy. As you can see in the code snippet above, there are several key points with the theme() function. They are necessary so that all elements animate without problems. Some of them may not be displayed if necessary. Example: Only the vertical gridlines and legends are drawn, but the axis titles and a few other components are removed from the lot.

Анимация

The key function here is transition_states(), which glues separate static graphs together. view_follow() is used to draw grid lines.

anim = staticplot + transition_states(year, transition_length = 4, state_length = 1) +
view_follow(fixed_x = TRUE) +
labs(title = 'GDP per Year : {closest_state}',
subtitle = "Top 10 Countries",
caption = "GDP in Billions USD | Data Source: World Bank Data")

Rendering

After the animation is created and stored in the anim object, it's time to render it using the animate() function. The renderer used in animate() may be different depending on the type of output file required.

GIF

# For GIF

animate(anim, 200, fps = 20, width = 1200, height = 1000,
renderer = gifski_renderer("gganim.gif"))

MP4

# For MP4

animate(anim, 200, fps = 20, width = 1200, height = 1000,
renderer = ffmpeg_renderer()) -> for_mp4

anim_save("animation.mp4", animation = for_mp4 )

Experience the Power of Effective Results

Creating Animated Bar Charts with R

As you can see, nothing complicated. The whole project is available in my github, you can use it however you see fit.

Skillbox recommends:

Source: habr.com

Add a comment