使用 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
我正在练习使用 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()
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