使用 gganimate 制作伯努利分布的动画并在 p = 0.5 处获得意外跳跃

Making an animation of the Bernoulli distribution using gganimate and getting an unexpected jump at p = 0.5

我正在练习使用 gganimate 并希望创建类似于 this Shiny app 但具有动画效果的内容。我取得了一些成功,但遇到了一个非常奇怪的错误,老实说我无法解释,希望有人能帮助我。 post 的其余部分包含一个完全可重现的示例。

这是我目前的情况:

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,我得到了想要的结果(尽管出于某种原因,有某些数字,看似完全随机,我 cannot 对数据进行子集化,即使我可以在数据框中清楚地看到它们。我已经检查过变量是数字和诸如此类的东西,所以这不是问题。这是一个附带问题,我不知道为什么会发生).

例如,在 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,这在数据。这只是我的 computer/R/ggplot/gganimate 的问题吗?

您需要使用 scale_y_continuous()

修正 y 轴
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

时,其中一个条仍然会跳到 1