Shading under the Normal curve
By R package build in intro stats
November 4, 2021
snorm for shaded normal density curve
Adapted from code from here. Used in my lab here
Description
Plots the pdf of the normal distribution with mean equal to mean and standard deviation equal to sd and shades in the area under the curve as determined by q (either a scalar of a vector of length 2)
Usage
qnorm(p, mean = 0, sd = 1, lower.tail = TRUE, ...)
qvector of quantiles
snorm <- function(q, mean=0, sd=1, rsd=4, lower.tail=TRUE, poly.col="skyblue",
add2plot = FALSE, add.prob=TRUE, add.q=TRUE, add.legend=FALSE, ...){
if (length(q)==2) {
q <- sort(q)
xx=seq(mean-rsd*sd,mean+rsd*sd,length=200)
yy=dnorm(xx,mean,sd)
if (!add2plot) {
plot(xx,yy,type="l", xlab="x", ylab= expression(paste(f*"("* x *" ; " * mu *", "*sigma*")")), ...)
} else {
lines(xx, yy, type="l")
}
x=seq(q[1],q[2],length=100)
y=dnorm(x,mean,sd)
polygon(c(q[1],x,q[2]),c(0,y,0),col=poly.col)
if (add.prob){
textheight <- max(dnorm(x, mean, sd))/4
prob <- round(pnorm(q[2], mean, sd) - pnorm(q[1], mean, sd), 3)
text(mean(q),textheight, prob)
}
if (add.q){
axis(1, at=q[1], labels = q[1], col="skyblue", col.axis="skyblue")
axis(1, at=q[2], labels = q[2], col="skyblue", col.axis="skyblue")
}
} else {
if (lower.tail) {
# lower tail probabilities:
xx=seq(mean-rsd*sd,mean+rsd*sd,length=200)
yy=dnorm(xx,mean,sd)
if (!add2plot) {
plot(xx,yy,type="l", xlab="x", ylab= expression(paste(f*"("* x *" ; " * mu *", "*sigma*")")) , ...)
} else {
lines(xx, yy, type="l")
}
x=seq(xx[1],q,length=100)
y=dnorm(x,mean, sd)
polygon(c(xx[1],x,q),c(0,y,0),col=poly.col)
if (add.prob){
textheight <- dnorm(q, mean, sd)/4
prob <- round(pnorm(q, mean, sd), 3)
text(q-0.5*sd,textheight, prob)
}
# arrows(0.5,0.1,-0.2,0,length=.15)
# text(0.5,0.12,"-0.2533")
} else if (!lower.tail) {
xx=seq(mean-rsd*sd,mean+rsd*sd,length=200)
yy=dnorm(xx,mean,sd)
if (!add2plot) {
plot(xx,yy,type="l", xlab="x", ylab= expression(paste(f*"("* x *" ; " * mu *", "*sigma*")")), ...)
} else {
lines(xx, yy, type="l")
}
x=seq(q,xx[length(xx)],length=100)
y=dnorm(x,mean,sd)
polygon(c(q,x,xx[length(xx)]),c(0,y,0),col=poly.col)
if (add.prob){
textheight <- dnorm(q, mean, sd)/4
prob <- round(pnorm(q, mean, sd, lower.tail = FALSE), 3)
text(q+0.5*sd,textheight, prob)
}
} else {
stop("please specify an appropriate value for lower.tail: TRUE, FALSE, or inner")
}
}
if (add.legend) {
ltext <- bquote(mu *" = "* .(mean)*", "*sigma *" = "* .(sd))
legend("topright", lwd= 2,
legend = ltext)
}
}
Examples
Lower tail probabilities
Shade in the region P(Z <= z) \(P(Z \leq z)\)
snorm(-0.2533)

P(Z > z)
snorm(0.5244, lower.tail=FALSE)
