# Dot-and-whisker plots # An example library(faraway) attach(hsb) ses.means <- tapply(math, ses, mean) ses.ucl <- ses.means + 1.96*tapply(math, ses, sd) ses.lcl <- ses.means - 1.96*tapply(math, ses, sd) y <- 1:nlevels(ses) names(y) <- levels(ses) plot(ses.means, y, yaxt="n", xlim=c(min(math),max(math)), xlab="Math", ylab="SES", pch=16, col="red") axis(2, at=y, labels=levels(ses), las=1) segments(ses.lcl, y, ses.ucl, y) # a simple function dotwhisker <- function(x, y) { x.means <- tapply(x, y, mean) x.ucl <- x.means + 1.96*tapply(x, y, sd) x.lcl <- x.means - 1.96*tapply(x, y, sd) y.n <- 1:nlevels(y) names(y.n) <- levels(y) plot(x.means, y.n, yaxt="n", xlim=c(min(x),max(x)), xlab=substitute(x), ylab=substitute(y), pch=16, col="red") axis(2, at=y.n, labels=levels(y), las=1) segments(x.lcl, y.n, x.ucl, y.n) } dotwhisker(math, ses) dotwhisker(math, prog) dotwhisker(read, prog:ses) # further work: this function needs to check its input # and provide enough space for labels on the left margin