Мы можем использовать polygon()
для окрашивания областей под кривой.polygon()
нужна двумерная матрица координат точек многоугольника, где она рисует прямые линии между этими точками.На самом деле их число равно бесконечности, но функция будет достаточно сглаживаться выше определенного числа, то есть нам нужна последовательность длины, скажем, 200
.Для матрицы координат нам нужны значения x
и соответствующие им значения y=dnorm(x)
.
# given z values
z.rg <- c(-2.25, 1.77)
# define cuts and canonical z-scores
cuts <- sort(sort(c(z.rg, -3.5, 3.5))) # c(-3.5, 3.5) will be the xlim of the plot
x.sq <- seq(cuts[1], cuts[4], len=200)
alpha <- c(.001, .01, .05)
z <- c(qnorm(alpha/2), 0, abs(qnorm(alpha/2)))
# plot
plot(x.sq, dnorm(x.sq), type="l", xlab="z-score", ylab="density",
main="Standard Normal Distribution", xaxt="n")
z <- c(qnorm(alpha/2), 0, abs(qnorm(alpha/2)))
axis(1, z, round(z, 2))
abline(h=0)
# random middle part (optional)
polygon(c(cuts[2], cuts[2], x.sq[x.sq > cuts[2] & x.sq < cuts[3]], cuts[3], cuts[3]),
c(0, dnorm(cuts[2]), dnorm(x.sq[x.sq > cuts[2] & x.sq < cuts[3]]), dnorm(cuts[3]), 0),
col="lightgrey", border=1)
# left tail
polygon(c(cuts[3], cuts[3], x.sq[x.sq > cuts[3]], cuts[4], cuts[4]),
c(0, dnorm(cuts[3]), dnorm(x.sq[x.sq > cuts[3]]), dnorm(cuts[4]), 0),
col="#4da6ff", border=1)
# right tail
polygon(c(cuts[1], cuts[1], x.sq[x.sq < cuts[2]], cuts[2], cuts[2]),
c(0, dnorm(cuts[1]), dnorm(x.sq[x.sq < cuts[2]]), dnorm(cuts[2]), 0),
col="#4da6ff", border=4)
# labels
arrows(z.rg, rep(dnorm(z.rg), length(z.rg)), z.rg, rep(dnorm(0)*.666, length(z.rg)),
length=0, lty=2, col=4)
sapply(z.rg, function(x) text(x, dnorm(0)*.666 + .02, bquote(italic("z=")~.(x)), col=4))