How do I combine the geom_smooth(method = "lm)
function with gganimate()
's transition_layers()
, so that, as the individual bars drift/grow upwards, the linear line of geom_smooth()
appears, like so: [Example of desired appearance of geom_smooth()
line] The only difference is that in my case, instead of the points, the bars would drift upwards as the line appears.
The bars currently work well, appearing by drifting upwards, made possible by using the transition_layers()
function of gganimate()
.
However, I can't figure out how to add the geom_smooth()
line, so it appears as the bars grow upwards. Right now, the line appears just at the end, as seen below.
See below for the current look of the animation.
Here is a simple reprex of my problem:
#Df for reprex
library(ggplot2)
library(tidyverse)year <- as.numeric(c(1996:2002,
1996:2002,
1996:2002))
c <- c(39, 40, 67, 80, 30, 140, 90, 23, 100, 123,
140, 1, 2, 1, 13, 3, 3, 30, 1, 3, 3)
df <- data.frame(year, c) %>%
select(year, c) %>%
arrange(year)#Static plot
(static_plot <- ggplot(data = df) +
geom_bar(data = df %>% filter(year == 1996), stat="identity", position ="stack",
aes(x = year, y = c)) +
geom_bar(data = df %>% filter(year == 1997), stat="identity", position ="stack",
aes(x = year, y = c)) +
geom_bar(data = df %>% filter(year == 1998), stat="identity", position ="stack",
aes(x = year, y = c)) +
geom_bar(data = df %>% filter(year == 1999), stat="identity", position ="stack",
aes(x = year, y = c)) +
geom_bar(data = df %>% filter(year == 2000), stat="identity", position ="stack",
aes(x = year, y = c)) +
geom_bar(data = df %>% filter(year == 2001), stat="identity", position ="stack",
aes(x = year, y = c)) +
geom_bar(data = df %>% filter(year == 2002), stat="identity", position ="stack",
aes(x = year, y = c)) +
labs(y = "year",
x = "c",
title = "Reprex") +
geom_smooth(df, mapping = aes(x = year, y = c), method = "lm",
colour = "black", se = F)
)#Animation
library(gganimate)
anim <- static_plot +
transition_layers(layer_length = 1, transition_length = 1) +
enter_drift(x_mod = 0, y_mod = -max(df$c))animate(anim, fps = 10, duration = 10,
width = 600, height = 500, renderer =
gifski_renderer())