【问题标题】:Overlaying a normal distribution on a histogram [duplicate]在直方图上叠加正态分布[重复]
【发布时间】:2011-12-28 00:31:38
【问题描述】:

可能重复:
ggplot2: Overlay histogram with density curve

抱歉,这可能是一个简单的问题,但我有一点问题。

我创建了一个基于二项分布的直方图,均值 = 0.65,sd = 0.015,样本数为 10000。直方图本身看起来不错。但是,我需要在此之上覆盖正态分布(具有相同的均值和标准差)。目前,我有以下内容:

qplot(x, data=prob, geom="histogram", binwidth=.05) + stat_function(geom="line", fun=dnorm, arg=list(mean=0.65, sd=0.015))

出现了一个分布,但它很小。这可能是因为平均值的计数上升到近 2,000,而正态分布要小得多。简而言之,它没有像 R 那样自动拟合数据。有没有办法指定正态分布的线来拟合直方图,或者有什么方法可以操纵直方图来拟合正态分布?

提前致谢。

【问题讨论】:

标签: r ggplot2 histogram normal-distribution


【解决方案1】:

“分布很小”,因为您在 counts 上绘制 密度函数。您应该在两个图中使用相同的指标,例如:

我尝试为您的示例生成一些数据:

x <- rbinom(10000, 10, 0.15)
prob <- data.frame(x=x/(mean(x)/0.65))

并将两者都绘制为密度函数

library(ggplot2)
ggplot(prob, aes(x=x)) + geom_histogram(aes(y = ..density..), binwidth=.05) + stat_function(geom="line", fun=dnorm, arg=list(mean=0.65, sd=0.015))

【讨论】:

  • 完美运行。找出如何将计数直方图更改为密度函数是我无法弄清楚的神奇步骤。谢谢!
【解决方案2】:

@daroczig 的答案是正确的,需要在绘制密度而不是计数时保持一致,但是:我无法看到您如何设法获得具有这些属性的二项式样本。特别是二项式的均值是n*p,方差是n*p*(1-p),标准差是sqrt(n*p*(1-p)),所以..

b.m <- 0.65
b.sd <- 0.015

计算方差:

b.v <- b.sd^2  ## n*p*(1-p)

计算p:

## (1-p) = b.v/(n*p) = b.v/b.m
## p = 1-b.v/b.m
b.p <- 1-b.v/b.m

计算n:

## n = n*p/p = b.m/b.p
b.n <- b.m/b.p

这给出了n=0.6502251p=0.9996538——所以我看不出如果没有n&lt;1,你怎么能得到这个二项分布,除非我把代数弄乱了......

【讨论】: