# Re: [R] Overlying a Normal Dist in a Barplot

From: Gabor Grothendieck <ggrothendieck_at_gmail.com>
Date: Sat 09 Jul 2005 - 14:51:08 EST

Offline, Marc pointed out to me that boxplot has an at= argument. This suggests that we could substitute a boxplot command for the rect command since a boxplot of c(0,a) looks like a bar from 0 to a if we use medlty=0 (which omits the median line) and boxwex=1 (which eliminates the space between the boxes). This does have the advantage that one does not have to compute the corners of the rectangles which my prior solution had to do.

(I also simplified the yrange calculation based on the fact that the height of the density curve is less than the maximum testdata point so we can just take the range of the that. Also I corrected x which should be 0:8 rather than what I wrote in the previous post.)

# data
testdata <- c(0.196454948, 0.063515510, 0.149187592, 0.237813885, 0.282127031, 0.066469719, 0.001477105, 0.001477105, 0.001477105) x <- 0:8

# setup plot ranges and axes
xrange <- range(x) + c(-0.5, +0.5)
yrange <- c(0, max(testdata))
plot(xrange, yrange, type = "n", xlab = "X", ylab = "Probability", xaxt = "n")

# draw bars using boxplot and density using curve boxplot(as.data.frame(rbind(0,testdata)), at = x, names = x,

boxwex = 1, medlty = 0, add = TRUE, col = "lightgrey") curve(dnorm(x, 2.84, 1.57), min(xrange), max(xrange), add = TRUE)

On 7/8/05, Gabor Grothendieck <ggrothendieck@gmail.com> wrote:
> On 7/8/05, Bret Collier <bret@tamu.edu> wrote:
> > R-Users,
> > Hopefully someone can shed some light on these questions as I had
> > little luck searching the archives (although I probably missed something
> > in my search due to the search phrase). I estimated multinomial
> > probabilities for some count data (number successful offspring) ranging
> > from 0 to 8 (9 possible response categories). I constructed a barplot
> > (using barplot2) and I want to "overlay" a normal distribution on the
> > figure (using rnorm (1000, mean, sd)). My intent is to show that using
> > a mean(and associated sd) estimated from discrete count data may not be
> > a valid representation of the distribution of successful offspring.
> >
> > Obviously the x and y axes (as structured in barplot2) will not be
> > equivalent for these 2 sets of information and this shows up in my
> > example below.
> >
> > 1) Is it possible to somehow reconcile the underlying x-axis to the
> > same scale as would be needed to overly the normal distribution (e.g.
> > where 2.5 would fall on the normal density, I could relate it to 2.5 on
> > the barplot)? Then, using axis (side=4) I assume I could insert a
> > y-axis for the normal distribution.
> >
> > 2) Is lines(density(x)) the appropriate way to insert a normal
> > distribution into this type of figure? Should I use 'curve'?
> >
> > If someone could point me in the right direction, I would appreciate
> > it.
> >
> > TIA, Bret
> >
> > Example:
> >
> > testdata
> > 0 0.196454948
> > 1 0.063515510
> > 2 0.149187592
> > 3 0.237813885
> > 4 0.282127031
> > 5 0.066469719
> > 6 0.001477105
> > 7 0.001477105
> > 8 0.001477105
> >
> >
> > x<-rnorm(1000, 2.84, 1.57)
> > barplot2(testdata, xlab="Fledgling Number",
> > ylab="Probability", ylim=c(0, 1), col="black",
> > border="black", axis.lty=1)
> > lines(density(x))
> >
>
> Maybe something like this using rect and curve:
>
> # data from your post
> testdata <- c(0.196454948, 0.06351551, 0.149187592, 0.237813885,
> 0.282127031, 0.066469719, 0.001477105, 0.001477105, 0.001477105)
> x <- 0:9
>
> # setup plot ranges noting max of normal density is at mean
> xrange <- range(x) + c(-0.5,+0.5)
> yrange <- range(c(testdata, dnorm(2.84, 2.84, 1.57), 0))
> plot(xrange, yrange, type = "n", xlab = "X", ylab = "Probability", xaxt = "n")
> axis(1, x)
>
> # draw bars using rect and density using curve
> rect(x - 0.5, 0, x + 0.5, testdata, col = "lightgrey")
> curve(dnorm(x, 2.84, 1.57), min(xrange), max(xrange), add = TRUE)
>

R-help@stat.math.ethz.ch mailing list