[R] Overlying a Normal Dist in a Barplot

Gabor Grothendieck ggrothendieck at gmail.com
Sat Jul 9 03:58:02 CEST 2005


On 7/8/05, Bret Collier <bret at 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)




More information about the R-help mailing list