【问题标题】:gganimate a frequency histogram to show change after each additional samplegganimate 频率直方图以显示每个附加样本后的变化
【发布时间】:2020-03-16 03:23:43
【问题描述】:

我有以下数据集代表人口的重复样本和随后的样本均值:

data.frame(sample = 1:50, mu = rnorm(n = 50, mean = 0, sd = 1))

我使用以下代码在 ggplot 中制作了频率直方图:

data.frame(sample = 1:50, mu = rnorm(n = 50, mean = 0, sd = 1)) %>% 
ggplot(data = ., aes(mu)) + 
geom_histogram()

我正在尝试使用gganimate 对此直方图进行动画处理,其中每个额外的样本都会改变图中均值的频率分布。但是,我不知道如何做到这一点。

我已经尝试过了,但结果并不理想:

data.frame(sample = 1:50, mu = rnorm(n = 50, mean = 0, sd = 1)) %>% 
ggplot(data = ., aes(x = mu)) +
  geom_histogram() +
  transition_time(sample) +
  ease_aes("linear") +
  enter_fade() +
  exit_fade()

我们将不胜感激。

【问题讨论】:

    标签: r ggplot2 histogram gganimate


    【解决方案1】:

    如果我理解正确,您希望直方图随着时间的推移而增加,每一步都添加一个新样本。如果 taht 是您想要的,可以这样实现:

    基本思想是按样本拆分,然后将样本累积到帧中,即在第 1 帧中仅显示样本 1,在第 2 帧中显示样本 1 和 2,.....

    library(gganimate)
    #> Lade nötiges Paket: ggplot2
    library(ggplot2)
    library(dplyr)
    library(purrr)
    
    set.seed(42)
    
    # example data
    df <- data.frame(sample = 1:500, mu = rnorm(n = 50, mean = 0, sd = 1))
    
    df_ani <- df %>% 
      split(.$sample) %>% 
      accumulate(~ bind_rows(.x, .y)) %>% 
      bind_rows(.id = "frame") %>% 
      mutate(frame = as.integer(frame))
    head(df_ani)
    #>   frame sample         mu
    #> 1     1      1  1.3709584
    #> 2     2      1  1.3709584
    #> 3     2      2 -0.5646982
    #> 4     3      1  1.3709584
    #> 5     3      2 -0.5646982
    #> 6     3      3  0.3631284
    
    p_gg <- ggplot(data = df, aes(x = mu)) +
      geom_histogram()
    p_gg
    #> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
    

    p_anim <- ggplot(data = df_ani, aes(x = mu)) +
      geom_histogram()
    
    anim <- p_anim + transition_manual(frame) +
      ease_aes("linear") +
      enter_fade() +
      exit_fade()
    anim
    #> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
    

    reprex package (v0.3.0) 于 2020-03-17 创建

    【讨论】:

    • 谢谢!这似乎运作良好。但是,它似乎随着更大的样本量而崩溃。例如,如果我们将样本量从 50 增加到 5000,则 animate 图表的整体形状与常规 ggplot 相同,但频率计数大幅膨胀?
    • 嗨。是的。你说的对。这不是我们想要的。我的方法的问题是直方图是为膨胀的数据集计算的,其中样本与每个额外的帧一起复制。因此,频率被夸大了,即对于 50 个样本大小,样本 1 在最后一帧中被计数 50 次,而样本 50 仅被计数一次。目前我对这个问题没有简单的解决方案。但我会考虑的。
    • 嗨。环顾四周后。简单的解决方案是切换到transition_manual。我编辑了我的代码,将样本大小增加到 500,并为未膨胀的 df 添加了 ggplot 以进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 2014-04-22
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    相关资源
    最近更新 更多