我们需要一次一步地运行优化器,这样我们就可以得到每个时间步的解决方案。然后使用做动画几乎是微不足道的gganimate
.
grid.b$f <- grid.f
op <- sapply(
seq_len(optim(theta,logll)$counts['function']),
function(i) {
set.seed(1234)
optim(theta, logll, control = list(maxit = i))$par
}
)
op_df <- data.frame(b0 = op[1,], b1 = op[2,])
op_df$step <- 1:nrow(op_df)
p <- ggplot(grid.b, aes(b0, b1)) +
geom_raster(aes(fill = f)) +
geom_contour(aes(z = f), col = 'grey40') +
geom_path(data = op_df, col = 'white') +
geom_point(data = op_df, col = 'white') +
scale_fill_viridis_c() +
coord_cartesian(expand = FALSE)
library(gganimate)
a <- p + transition_reveal(step)
anim_save(
'~/Desktop/anim.gif', a, height = 400, width = 400,
nframes = nrow(op_df), fps = 30, duration = nrow(op_df) / 30
)
一帧就是一步。您可以平滑过渡,但离散的性质可以提供丰富的信息。