library(dplyr)
library(ggplot2)
library(broom)
library(gganimate)
theme_set(theme_bw())
set.seed(2016)
min_weight <- .0005
# original data and bandwidths
bws <- c(.25, .5, .75, 1)
x_data <- c(rnorm(30, 0), rnorm(15, 6))
# add some y noise to be visible
dat <- data_frame(x = x_data) %>%
mutate(y = rnorm(n(), .5, .025))
# density fits for each banwidth
fits <- dat %>%
inflate(bw = bws) %>%
do(tidy(density(.$x, bw = .$bw[1], from = -4, to = 9, n = 100)))
centers <- sort(unique(fits$x))
# calculate weights at each x0 center
prep <- dat %>%
inflate(center = centers, bw = bws) %>%
mutate(weight = dnorm(x, center, bw)) %>%
filter(weight > min_weight)
# also raster data for the background
ras <- expand.grid(x = seq(min(centers), max(centers), .05),
y = c(0, 1)) %>%
inflate(center = centers, bw = bws) %>%
mutate(weight = dnorm(x, center, bw)) %>%
filter(weight > min_weight)
# create the plot with layers for the background, the points, the red fills, the
# red vertical line, and the cumulative line plot
p <- ggplot(prep, aes(x, y)) +
geom_raster(aes(alpha = weight, frame = center), data = ras, fill = "gray", hjust = 0, vjust = 0) +
geom_point(shape = 1, size = 3, data = dat, alpha = .25) +
geom_point(aes(alpha = weight, frame = center), color = "red", size = 3) +
geom_vline(aes(xintercept = x, frame = x), data = fits, lty = 2, color = "red") +
geom_line(aes(frame = x, cumulative = TRUE), color = "red", data = fits) +
coord_cartesian(ylim = c(0, max(prep$y))) +
facet_wrap(~bw) +
ylab("")
g <- gg_animate(p, interval = .1, title_frame = FALSE)
g