Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
An example of animating the build up of a histogram with dropping balls using tweenr, gganimate and ggplot2
library(tweenr) # Available on CRAN
library(ggforce) # Install from thomasp85/ggforce
library(gganimate) # Install from dgrtwo/gganimate
set.seed(2)
x <- sample(9,20, prob=c(1,2,3,4,5,4,3,2,1), replace=T)
df <- data.frame(x = x, y = 15)
dfs <- list(df)
for(i in seq_len(nrow(df))) {
dftemp <- tail(dfs, 1)
dftemp[[1]]$y[i] <- sum(dftemp[[1]]$x[seq_len(i)] == dftemp[[1]]$x[i])
dfs <- append(dfs, dftemp)
}
dfs <- append(dfs, dfs[rep(length(dfs), 3)])
dft <- tween_states(dfs, 10, 1, 'cubic-in', 200)
dft$y <- dft$y - 0.5
dft <- dft[dft$y != 14.5, ]
dft$type <- 'Animate'
dfh <- data.frame(x=x, type = 'Histogram')
p <- ggplot(dft) +
geom_circle(aes(x0=x, y0=y, r=0.5, frame = .frame), n=20, fill = 'steelblue') +
geom_histogram(aes(x=x), data = dfh, fill = 'forestgreen', color = 'black', binwidth = 1) +
coord_fixed(ylim = c(0, 13.5)) +
theme_bw() +
facet_grid(.~type)
animation::ani.options(interval = 1/20)
gg_animate(p, 'hist_ex.gif', title_frame = FALSE)
@thomasp85

This comment has been minimized.

Copy link
Owner Author

@thomasp85 thomasp85 commented Jun 7, 2016

Result:
hist_ex

@skanskan

This comment has been minimized.

Copy link

@skanskan skanskan commented Jun 7, 2016

Great. I was asking for the left-side picture. Thank you.

@MattCowgill

This comment has been minimized.

Copy link

@MattCowgill MattCowgill commented Apr 25, 2019

Hi @thomasp85 - any idea how I would do this with the new gganimate API?

@gustavek

This comment has been minimized.

Copy link

@gustavek gustavek commented Mar 13, 2020

Hi @thomasp85 - any idea how I would do this with the new gganimate API?

Am trying to do this same animation. I haven't been able to get it to work with the right-hand histogram but this code will get you the left-hand animated graph with the new gganimate syntax:

p <- ggplot(dft) +
  geom_circle(aes(x0=x, y0=y, r=0.5), n=20, fill = 'steelblue') +
  coord_fixed(ylim = c(0, 13.5)) + 
  theme_bw() + 
  transition_manual(.frame)
@maxdrohde

This comment has been minimized.

Copy link

@maxdrohde maxdrohde commented Apr 26, 2020

I am also interested in knowing how to reproduce this in the new gganimate framework.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.