[R] Barplots and error indicators: Some R-Code
Frank E Harrell Jr
f.harrell at vanderbilt.edu
Fri Jun 18 16:48:03 CEST 2004
dieter.haering at fal.admin.ch wrote:
> I' ve seen that several people are looking for a function that creates a
> barplot with an error indicators (I was one of them myself). Maybe you will
> find the following code helpful (There are some examples how to use it at
> the end):
>
>
> # Creates a barplot.
> #bar.plot() needs a datavector for the height of bars and a error
> #indicator for the interval
> #many of the usual R parameters can be set: e.g. ylim, main, col, etc.
> #The direction of the error indicator can be specified as "bo" for both,
> "lo" lower, "up" #upper
> #The width of the indicator hat is set as a percentage of the x-width of the
> plot:e.g. *hat=0.05
>
> bar.plot<-function(data, err.ind, ind.side=NA, hat=NA, ylim=c(0,
> max(data+err.ind, na.rm=TRUE)*1.2), col=NA, xlab="your x-lab", ylab="your
> y-lab", main="your main", names.arg=NA, space=0.2){
> if (is.na(ind.side)){
> ind.side<-"up"} #only upper error indicator (default), else: "lo" or "bo"
> if (is.na(hat)){
> hat<-0.01} #fraction of the x axis that defines the size of the error
> indicator hat
> if (is.na(col)){col<-"white"} #the default color is white
> x.cor<-barplot(data, ylim=ylim, xlab=xlab, ylab=ylab, main=main,
> names.arg=names.arg, col=col, space=space)
> smidge<-diff(par("usr")[1:2])*hat
> up.ind<-data+err.ind
> lo.ind<-data-err.ind
> segments(0,0,x.cor,0) # draws X-Axis
> if (ind.side=="up"){
> segments(x.cor, data, x.cor, up.ind)
> segments(x.cor, up.ind, x.cor+smidge, up.ind)
> segments(x.cor, up.ind, x.cor-smidge, up.ind)
> }else{
> if (ind.side=="bo"){
> segments(x.cor, data, x.cor, up.ind)
> segments(x.cor, up.ind, x.cor+smidge, up.ind)
> segments(x.cor, up.ind, x.cor-smidge, up.ind)
> segments(x.cor, data, x.cor, lo.ind)
> segments(x.cor, lo.ind, x.cor+smidge, lo.ind)
> segments(x.cor, lo.ind, x.cor-smidge, lo.ind)
> }else{
> segments(x.cor, data, x.cor, lo.ind)
> segments(x.cor, lo.ind, x.cor+smidge, lo.ind)
> segments(x.cor, lo.ind, x.cor-smidge, lo.ind)
> }
> }
> }
>
>
> #Examples
> par(mfrow=c(2,2))
>
> data<-c(3.2, 3.3, 3.6, 4, 3.1, 3.3, 3.1, 4.5, 3.2, 3.3, 3.1, 3.4)
> se<-sqrt(data)
> bar.plot(data, se) #easy example
>
> data<-c(3.2, 3.3, 3.6, 4, 3.1, 3.3, 3.1, 4.5, 3.2, 3.3, 3.1, 3.4)
> se<-c(sqrt(data))
> bar.plot(data, se,ind.side="lo", ylim=c(0, 10), col="lavender", space=0.25,
> hat=0)
>
> data<-c(15, 15, 19, 22)
> se<-c(3, 5, 6, 4.5)
> nam<-c("L.c","O.v","C.i","L.u")
> bar.plot(data, se, col="orange", ind.side="bo", hat=0.05, main="",
> xlab="species", ylab="CT conc.")
>
> data<-c(4,5,1,1.3,6,7.1,5,2.6)
> se<-c(sqrt(data))
> nam<-rep(c("C","T"),4)
> spa<-rep(c(1.5, 0.2),4)
> col<-rep(c("green","red"),4)
> bar.plot(data, se, col=col, ind.side="up", main="Trees !", ylab="CT conc.",
> space=spa, names.arg=nam)
>
>
>
>
>
> ***********************************************************************
> Dieter Häring
> Eidg. Forschungsanstalt für Agraroekologie und Landbau (FAL)
> Reckenholzstrasse 191
> 8046 Zürich
>
> Tel. 01 / 377 71 62
> FAX 01 / 377 72 01
> mailto:dieter.haering at fal.admin.ch
> www.reckenholz.ch
>
Bar charts have many problems as pointed out in Bill Cleveland's book
Elements of Graphing Data. Bar charts with error bars have even more
problems. I prefer dot plots with error bars. The Dotplot function in
the Hmisc package will make such graphs. Hmisc's xYplot will do
likewise for line graphs, including an option for error bands and shaded
error bands.
--
Frank E Harrell Jr Professor and Chair School of Medicine
Department of Biostatistics Vanderbilt University
More information about the R-help
mailing list