[R] A function for plotting a boxplot with added dot and bars (formean and SE) - please help improve my code

ONKELINX, Thierry Thierry.ONKELINX at inbo.be
Wed Aug 12 14:23:58 CEST 2009


Two solutions with errorbars

library(ggplot2)
#option 1
lowCI <- function(x){mean(x) + qt(0.025, length(x) - 1) * sd(x) /
sqrt(length(x))}
highCI <- function(x){mean(x) + qt(0.975, length(x) - 1) * sd(x) /
sqrt(length(x))}
ggplot(mtcars, aes(x = factor(round(wt)), y = mpg, colour = factor(am)))
+ geom_boxplot() + geom_point(stat = "summary", fun.y = mean, position =
position_dodge(width = 0.75)) + geom_errorbar(stat = "summary", fun.ymin
= lowCI, fun.ymax = highCI, position = position_dodge(width = 0.75),
linetype = 2)

#option2
mtcars$fwt <- factor(round(mtcars$wt))
MeanCI <- ddply(mtcars, c("fwt", "am"), function(z){
	with(z, mean(mpg) + qt(c(low = 0.025, mean = 0.5, high = 0.975),
length(mpg) - 1) * sd(mpg) / sqrt(length(mpg)))
})
ggplot(mtcars, aes(x = fwt, y = mpg, colour = factor(am))) +
geom_boxplot() + geom_point(data = MeanCI, aes(y = mean), position =
position_dodge(width = 0.75)) + geom_errorbar(data = MeanCI, aes(ymin =
low, ymax = high), position = position_dodge(width = 0.75), linetype =
2)

 

------------------------------------------------------------------------
----
ir. Thierry Onkelinx
Instituut voor natuur- en bosonderzoek / Research Institute for Nature
and Forest
Cel biometrie, methodologie en kwaliteitszorg / Section biometrics,
methodology and quality assurance
Gaverstraat 4
9500 Geraardsbergen
Belgium
tel. + 32 54/436 185
Thierry.Onkelinx at inbo.be
www.inbo.be

To call in the statistician after the experiment is done may be no more
than asking him to perform a post-mortem examination: he may be able to
say what the experiment died of.
~ Sir Ronald Aylmer Fisher

The plural of anecdote is not data.
~ Roger Brinner

The combination of some data and an aching desire for an answer does not
ensure that a reasonable answer can be extracted from a given body of
data.
~ John Tukey
  



________________________________

Van: Tal Galili [mailto:tal.galili at gmail.com] 
Verzonden: woensdag 12 augustus 2009 12:48
Aan: ONKELINX, Thierry
CC: r-help at r-project.org
Onderwerp: Re: [R] A function for plotting a boxplot with added dot and
bars (formean and SE) - please help improve my code


Thanks Thierry, 
I didn't know about that, it's always nice to see different ways of
doing things.
Question: How would you add the bars ?


Hope to see more interesting replies,
Tal









On Wed, Aug 12, 2009 at 1:29 PM, ONKELINX, Thierry
<Thierry.ONKELINX at inbo.be> wrote:


	This can be done much easier and transparent with ggplot2
	
	library(ggplot2)
	ggplot(mtcars, aes(x = factor(round(wt)), y = mpg, colour =
factor(am)))
	+ geom_boxplot() + geom_point(stat = "summary", fun.y = "mean",
position
	= position_dodge(width = 0.75))
	
	HTH,
	
	Thierry
	
	
------------------------------------------------------------------------
	----
	ir. Thierry Onkelinx
	Instituut voor natuur- en bosonderzoek / Research Institute for
Nature
	and Forest
	Cel biometrie, methodologie en kwaliteitszorg / Section
biometrics,
	methodology and quality assurance
	Gaverstraat 4
	9500 Geraardsbergen
	Belgium
	tel. + 32 54/436 185
	Thierry.Onkelinx at inbo.be
	www.inbo.be
	
	To call in the statistician after the experiment is done may be
no more
	than asking him to perform a post-mortem examination: he may be
able to
	say what the experiment died of.
	~ Sir Ronald Aylmer Fisher
	
	The plural of anecdote is not data.
	~ Roger Brinner
	
	The combination of some data and an aching desire for an answer
does not
	ensure that a reasonable answer can be extracted from a given
body of
	data.
	~ John Tukey
	
	-----Oorspronkelijk bericht-----
	Van: r-help-bounces at r-project.org
[mailto:r-help-bounces at r-project.org]
	Namens Tal Galili
	Verzonden: woensdag 12 augustus 2009 11:48
	Aan: r-help at r-project.org
	Onderwerp: [R] A function for plotting a boxplot with added dot
and bars
	(formean and SE) - please help improve my code
	

	Hello people,
	
	A while back I wanted to plot boxplots with interactions that
will have
	a dot for the mean of the sample + bars for the SE.
	After searching for some code, I found something that did it for
one
	level, but couldn't find something that will allow for
interactions the
	way the original boxplot does.
	
	After playing with the original code, I found a way for allowing
the
	boxplot code to introduce interactions to it. The price for that
was
	that I was forced to use a little different syntax for the
function then
	that of the original boxplot. In order to use the function, one
must use
	lists for the function input arguments, and until now I didn't
find a
	way for doing the same task from a formula input.
	So for example, the original boxplot will be written like this:
	boxplot(y ~ A*B)
	Where as my function will look like this:
	boxplot.2(y , list(A,B) )
	
	
	
	In this e-mail I am giving away the code for:
	1) helping out others searching for this solution. and
	2) in hope to have more experienced R programmers come by and
improve on
	this code (by, for example, removing the for loop in it, or
allowing to
	use a formula instead of a list input)
	
	
	
	Here is the code:
	
	
	boxplot.2 <- function(fo.head, list.fo.tail = list(1),
print.mean = T,
	plot.CI = T, add.mean.sd.to.boxplot.names = T, plot.round.factor
= 2
	,...) {
	 require(gplots)
	 tmp   <- split(fo.head ,  list.fo.tail)
	 means <- sapply(tmp, mean)
	 stdev <- sqrt(sapply(tmp, var))  #IS right - because of the
sqrt !!!
	<- sqrt(sapply(tmp, var))  # was var, I changed it to sd
	 n     <- sapply(tmp,length)
	 ciw   <- qt(0.975, n-1) * stdev / sqrt(n)
	 old.names = attributes(tmp)$names
	 length.of.names = length(old.names)
	 new.names = as.list(old.names)
	 for(i in c(1:length.of.names))
	 {
	   new.names[[i]] <- paste(old.names[i], " (",
	round(means[i],plot.round.factor) ,",",
round(ciw[i],plot.round.factor)
	,")", sep = "")
	 }
	
	 if(add.mean.sd.to.boxplot.names)
	      {
	          if(length(list.fo.tail) == 1)
	          {
	            sub.text = paste("mean:", round(means,3),
	"(SE:",round(ciw,3), " ; N:" ,n, ")")
	            boxplot(tmp, xlab = sub.text, cex.axis = min(1,
	mean(c(1,12/
	max(nchar(new.names)) ))  ), ...)
	          } else {
	            boxplot(tmp, names = new.names, cex.axis = min(1,
	mean(c(1,12/
	max(nchar(new.names)) ))  ), ...)
	          }
	 } else {  boxplot(tmp, ...) } # else - make boxplot without
them
	
	 # adding the points and the bars
	 points(means, col = 'red', pch = 19)
	 if(require(gplots) & plot.CI) {
	 plotCI(x=means, uiw=ciw, col="white", barcol="blue",
	        xaxt="n" , add = T)
	        }
	
	 if(print.mean) {
	     small.mean.and.se.table <-
rbind(round(means,3),round(ciw,3), n)
	     rownames(small.mean.and.se.table) <- c("means:", "SE's:",
"N")
	     print(t(small.mean.and.se.table))
	   }
	} # <-- end boxplot3
	
	
	# Here is a small example:
	data(mtcars)
	head(mtcars)
	attach(mtcars)
	boxplot.2(mpg , list(round(wt), am) , data = mtcars, las = 2)
	
	
	
	
	
	
	Hope this will benefit others, and also hope that others will
improve on
	this code and give it back to the community, Tal galili
	
	
	
	--
	----------------------------------------------
	
	
	My contact information:
	Tal Galili
	Phone number: 972-50-3373767
	FaceBook: Tal Galili
	My Blogs:
	http://www.r-statistics.com/
	http://www.talgalili.com
	http://www.biostatistics.co.il
	
	
	       [[alternative HTML version deleted]]
	
	______________________________________________
	R-help at r-project.org mailing list
	https://stat.ethz.ch/mailman/listinfo/r-help
	PLEASE do read the posting guide
	http://www.R-project.org/posting-guide.html
	and provide commented, minimal, self-contained, reproducible
code.
	
	Dit bericht en eventuele bijlagen geven enkel de visie van de
schrijver weer
	en binden het INBO onder geen enkel beding, zolang dit bericht
niet bevestigd is
	door een geldig ondertekend document. The views expressed in
this message
	and any annex are purely those of the writer and may not be
regarded as stating
	an official position of INBO, as long as the message is not
confirmed by a duly
	signed document.
	




-- 
----------------------------------------------


My contact information:
Tal Galili
Phone number: 972-50-3373767
FaceBook: Tal Galili
My Blogs:
http://www.r-statistics.com/
http://www.talgalili.com
http://www.biostatistics.co.il




Dit bericht en eventuele bijlagen geven enkel de visie van de schrijver weer 
en binden het INBO onder geen enkel beding, zolang dit bericht niet bevestigd is
door een geldig ondertekend document. The views expressed in  this message 
and any annex are purely those of the writer and may not be regarded as stating 
an official position of INBO, as long as the message is not confirmed by a duly 
signed document.




More information about the R-help mailing list