将一部分正态分布着色

时间:2013-05-12 05:22:56

标签: r plot

我想填充或着色正常分布的一部分。我想在这里做一个例子:

http://msenux.redwoods.edu/math/R/StandardNormal.php

x=seq(-4,4,length=200)
y=dnorm(x)
plot(x,y,type="l", lwd=2, col="blue")
x=seq(-1,1,length=100)
y=dnorm(x)
polygon(c(-1,x,1),c(0,y,0),col="gray")

但是,如果我尝试将上述代码概括为x轴的任何部分,我能想到的最好的是:

sigma <- 1
mu    <- 0

lower.x <- -0.0
upper.x <-  2.1

x  <- seq(-4, 4, length = 200)
y  <- ( 1/(sigma * sqrt(2*pi)) ) * ( exp(1)^( (-1 * ((x - mu)^2)) / (2*(sigma^2)) ) )
plot(x,y,type="l", lwd=2, col="blue")

x=seq(lower.x, upper.x, length=100)
y  <- ( 1/(sigma * sqrt(2*pi)) ) * ( exp(1)^( (-1 * ((x - mu)^2)) / (2*(sigma^2)) ) )
polygon(c(lower.x,x,1), c(0,y,0), col="gray")

我认为错误涉及第二个长度声明,但我无法弄清楚如何纠正错误。另外,我希望正态分布曲线的蓝线不被阴影区域的边界覆盖。虽然这不太令人担忧。谢谢你的任何建议。

2 个答案:

答案 0 :(得分:1)

下面的代码似乎做了我想要的,或者实际上是这样。

我使用下面的by语句而不是length语句。我不确定,但我怀疑x值的第二个序列必须是第一个x值序列的子集。

然后我重绘正态分布曲线以覆盖多边形的顶部灰色边框。我希望改进的结果的唯一方面是蓝色在覆盖灰色的地方有点暗。但在这一点上,这似乎很小。

sigma <- 1
mu    <- 0

lower.x <- -0.0
upper.x <-  2.1

x  <- seq(-4, 4, by = 0.1)
y  <- ( 1/(sigma * sqrt(2*pi)) ) * ( exp(1)^( (-1 * ((x - mu)^2)) / (2*(sigma^2)) ) )
plot(x,y,type="l", lwd=2, col="blue")

x=seq(lower.x, upper.x, by = 0.1)
y  <- ( 1/(sigma * sqrt(2*pi)) ) * ( exp(1)^( (-1 * ((x - mu)^2)) / (2*(sigma^2)) ) )
polygon(c(lower.x,x,upper.x), c(0,y,0), col="gray")
lines(x, y, col="blue", lwd=2)

答案 1 :(得分:1)

或多或少来自:http://www.fernandohrosa.com.br/en/P/shaded_areas_in_r/

lower.x <- 0
upper.x <- 2.1
step <- (upper.x - lower.x) / 100
sigma <- 1
mu <- 0
bounds <- c(mu-3*sigma, mu+3*sigma)
cord.x <- c(lower.x,seq(lower.x,upper.x,step),upper.x)
cord.y <- c(0,dnorm(seq(lower.x,upper.x,step),mu,sigma),0)
curve(dnorm(x,mu,sigma),xlim=bounds) 
polygon(cord.x,cord.y,col='skyblue')

另请参阅http://www.r-bloggers.com/functions-for-plotting-and-getting-greek-in-labels/ 并供将来参考: How to shade a region under a curve using ggplot2