我正在尝试为模拟模型生成动画,并且我想展示在模拟运行时结果分布如何变化。
我已经看到用于散点图的gganimate,但没有用于箱形图(或理想的小提琴图)。在这里,我提供了一个代表。
当我使用sim_category
(对于一定数量的模拟运行来说是一个桶)时,我希望结果是所有先前运行的累积,以显示总分布。
在此示例(以及我的实际代码)中,cumulative = TRUE
不会执行此操作。为什么是这样?
library(gganimate)
library(animation)
library(ggplot2)
df = as.data.frame(structure(list(ID = c(1,1,2,2,1,1,2,2,1,1,2,2),
value = c(10,15,5,10,7,17,4,12,9,20,6,17),
sim_category = c(1,1,1,1,2,2,2,2,3,3,3,3))))
df$ID <- factor(df$ID, levels = (unique(df$ID)))
df$sim_category <- factor(df$sim_category, levels = (unique(df$sim_category)))
ani.options(convert = shQuote('C:/Program Files/ImageMagick-7.0.5-Q16/magick.exe'))
p <- ggplot(df, aes(ID, value, frame= sim_category, cumulative = TRUE)) + geom_boxplot(position = "identity")
gganimate(p)
答案 0 :(得分:1)
gganimate
的累积不会累积数据,只会在后续帧中保留gif帧。为了达到你想要的效果,你必须在构建情节之前进行积累,具体如下:
library(tidyverse)
library(gganimate)
df <- data_frame(
ID = factor(c(1,1,2,2,1,1,2,2,1,1,2,2), levels = 1:2),
value = c(10,15,5,10,7,17,4,12,9,20,6,17),
sim_category = factor(c(1,1,1,1,2,2,2,2,3,3,3,3), levels = 1:3)
)
p <- df %>%
pull(sim_category) %>%
levels() %>%
as.integer() %>%
map_df(~ df %>% filter(sim_category %in% 1:.x) %>% mutate(sim_category = .x)) %>%
ggplot(aes(ID, value, frame = factor(sim_category))) +
geom_boxplot(position = "identity")
gganimate(p)