How to plot mean and standard error in Boxplot in R
Asked Answered
N

2

6

I have two categorical factors ('Habitat' and 'Locality'), and one continuous variable (T). 'Habitat' has two level and 'Locality' has eight levels. I want to change the default whiskers to represent the SE, and the median into the mean for each boxplot. Is there a way to do this and taking both of the categorical factors into account when plotting? Many thanks in advance.

This is what I have done with the default setting of boxplot ggplot, showing the first and third quartiles with median intervals.

ggplot(data,aes(x=Locality,y=T)) + 
  geom_boxplot(aes(fill=interaction(Habitat,Locality), 
                   group=interaction(factor(Habitat),Locality)),
               outlier.shape=1,outlier.size=3) + 
  theme_bw() + 
  theme(
    panel.grid.major=element_blank(),
    panel.grid.minor=element_blank(),
    axis.line=element_line(colour='black'),
    legend.position='none',
    axis.text.x=element_text(angle=90,hjust=1,size=12)) + 
  scale_y_continuous('T') + 
  xlab('Locality')
Nedanedda answered 23/9, 2014 at 16:1 Comment(0)
T
12

First write a function that compute the min, mean-1SEM, mean, mean+1SEM, and Max. Then map these 5 values onto a boxplot using stat_summary.

library(gridExtra)
library(ggplot2)

MinMeanSEMMax <- function(x) {
  v <- c(min(x), mean(x) - sd(x)/sqrt(length(x)), mean(x), mean(x) + sd(x)/sqrt(length(x)), max(x))
  names(v) <- c("ymin", "lower", "middle", "upper", "ymax")
  v
}

g1 <- ggplot(mtcars, aes(factor(am), mpg)) + geom_boxplot() +
  ggtitle("Regular Boxplot")

g2 <- ggplot(mtcars, aes(factor(am), mpg)) +
  stat_summary(fun.data=MinMeanSEMMax, geom="boxplot", colour="red") + 
  ggtitle("Boxplot: Min, Mean-1SEM, Mean, Mean+1SEM, Max")


grid.arrange(g1, g2, ncol=2)

enter image description here

Trisaccharide answered 23/9, 2014 at 16:59 Comment(1)
Excellent answer, thanks. How would you go about doing the same thing but with subgroups? For example if you had 0A, 0B, 1A and 1B on your x-axis?Macron
K
5

I expect that it is possible, but it is also possible to put up a traffic sign that is a red octagon and says "Increased speed limit ahead", I expect that both will be more confusing that helpful. The boxplot has a standard definition of what the parts represent. When a user sees a boxplot they should not have to go through extra mental gymnastics to rethink what the different parts mean. Why not use a different representation if you don't want to represent these standard summaries. The geom_crossbar or geom_errorbar function/geoms may be more appropriate for your display (and probably easier to use than trying to modify the boxplot geom).

Kinghood answered 23/9, 2014 at 16:56 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.