One of the R OpenSci ozunconference 2018 projects was all about gganimate . The guys and gals dubbed this project learngganimate and dedicated an expansive GitHub repository to it. As part of this project, they created some — let’s call it — very creative GIFS.

One of their GIFs I particularly liked, copied below. Using the OpenSci syn package they looked up synonyms for cool and printed those in some nice colors.

On GitHub, you can find the original code for this project. However, I didn’t get it working on my machine — due to recent updates to the gganimate package — so I had to create my own version, which you find below.

devtools::install_github("ropenscilabs/syn") # only needed for first-time install

devtools::install_github('thomasp85/gganimate') # install the most recent version of gganimate



library(syn)

library(ggplot2)

library(gganimate)

library(dplyr)



set.seed(1) # for reproducibility purposes



synonyms <- syn("great") # store synonyms for your word of chosing



n = 15 # number of synonyms to sample

time = 3 # their position in the plot as well as the duration of their display



# generate dataframe with random synonyms sentences and assigned locations

sentences_df <- data_frame(

sentence = paste("#rstats ==", sample(synonyms, n), "!!")

, x = time

, y = seq(time, time * n, time)

)



# generate the actual plot

ggplot(sentences_df,

aes(x, -y,

label = sentence,

group = sentence,

fill = sentence)) +

geom_label(size = 10, colour = "white", label.size = 0.3) +

transition_components(id = sentence, time = y,

enter_length = n * time + time ,

exit_length = n * time + time) +

scale_fill_viridis_d() +

theme_void() +

theme(legend.position = "none") ->

plot1



# animate the plot

animate(plot1, nframes = n * time + time)

This code renders the following GIF:

Try to play around with the code to change the GIF:

Change the set.seed argument to get different synonyms in there,

argument to get different synonyms in there, Change the n to include more or less words,

to include more or less words, Change the x and y variables to position the labels differently,

and variables to position the labels differently, Change the size , colour , and fill of the geom_label function to change the label design,

, , and of the function to change the label design, Or change the transition_components arguments to change the display timing.

Moreover, you could change the sentence variable to something to motivate yourself. For instnace, in the following code, I changed it to include my name, and synonyms for the word good. Moreover, I picked a different gganimate function — transition_time — to display the labels according to a different pattern.

set.seed(2) # for reproducibility purposes



# generate dataframe with random synonyms sentences and assigned locations

sentences_df <- data_frame(

sentence = paste0("Paul is ", sample(syn("good"), n), "!")

, x = time

, y = seq(time, time * n, time)

)



# generate the actual plot

ggplot(sentences_df,

aes(x, -y,

label = sentence,

group = sentence,

fill = sentence)) +

geom_label(size = 10, colour = "white", label.size = 0.3) +

transition_time(time = y) +

scale_fill_viridis_d() +

theme_void() +

theme(legend.position = "none") ->

plot2



# animate the plot

animate(plot2, nframes = n * time + time)

I think the result is very pleasing, comforting, and positive! Except maybe for the dinkum bit, but fortunately neither I or thesaurus.com know what that means, so it might as well be positive : )

If you go about creating your own animations, you can save them using the save_animation function of the gganimate package. Good luck!

PS. The code to generate the GIF at the top of this blog is posted below. It uses another gganimate function called transition_states :

set.seed(3) # for reproducibility purposes



time = 5

n = 5



# generate dataframe with random synonyms sentences and assigned locations

sentences_df <- data_frame(

sentence = paste0("You are ", sample(syn("amazing"), n), "!")

, x = runif(n)

, y = seq(time, time * n, time)

)



# generate the actual plot

ggplot(sentences_df,

aes(x, -y,

label = sentence,

group = sentence,

fill = sentence)) +

geom_label(size = 12, colour = "white", label.size = 0.5) +

transition_states(states = sentence, transition_length = time, state_length = time) +

theme_void() +

theme(legend.position = "none") +

coord_cartesian(xlim = c(-0.5, 1.5)) ->

plot3



# animate the plot

animate(plot3, nframes = n * time + time)