首页 > 解决方案 > 使用 gganimate 制作伯努利分布的动画,并在 p = 0.5 处意外跳跃

问题描述

我正在练习使用gganimate并想创建类似于这个闪亮应用程序但动画的东西。我取得了一些成功,但遇到了一个非常奇怪的错误,我真的无法解释,希望有人能帮助我。这篇文章的其余部分包含一个完全可重现的示例。

这是我到目前为止所拥有的:

bernoulli <- cbind.data.frame(c(rep(1,101), rep(0,101)), c(seq(1,0,by=-0.01), seq(0,1,by=0.01)), c(seq(1,0,by=-0.01), seq(1,0,by=-0.01)))
names(bernoulli) <- c("success", "probability", "p")
bernoulli <- bernoulli[order(bernoulli$p),]
row.names(bernoulli) <- c(1:nrow(bernoulli))

这将创建我正在使用的数据框。这是三个变量,非常简单。我的动画的逻辑是二分结果的概率如何随伯努利分布的p参数而变化。举一个静态图的例子,如果我这样做:

ggplot(subset(bernoulli, p == 0.70), aes(x=success, y=probability)) +
  geom_bar(stat="identity")

并改变p我的子集,我得到了想要的结果(尽管由于某种原因,有某些数字,看似完全随机,我无法对数据进行子集,即使我可以在数据框中清楚地看到它们。我已经检查了变量是数字等等,所以这不是问题。这是一个附带问题,我不知道它为什么会发生)。

例如,在 p == 0.12 和 p == 0.70 之间切换,并将它们与前面提到的 Shiny 应用程序进行比较,您会看到它匹配,当然轴会有所不同。

当我尝试按如下方式实现动画时:

ggplot(bernoulli, aes(x=success, y=probability)) +
  geom_bar(stat="identity") +
  transition_time(p)

一切看起来都很棒!轴匹配得很好,动画流畅......但是一旦条达到 p == 0.50,它们都跳到 1,这根本没有反映在数据中。这只是我的计算机/R/ggplot/gganimate 的问题吗?

标签: rggplot2gganimatebernoulli-probability

解决方案


您需要使用固定 y 轴scale_y_continuous()

library(dplyr)
bernoulli %>%
    dplyr::filter(probability > 0 & probability < 1) %>%
    ggplot(aes(x=success, y=probability)) +
        geom_col() + 
        scale_y_continuous(limits = c(0,1)) +
        transition_time(p)

如果您不固定 y 轴,则在以下情况下将如下所示p==0.5在此处输入图像描述


真的很奇怪,如果我不做上面的过滤器,当p==0.5


推荐阅读