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, - Change the
n
to include more or less words, - Change the
x
and y
variables to position the labels differently, - Change the
size
, colour
, and fill
of the geom_label
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)
Like this:
Like Loading...