3

In ggplot2, I would like to have the whiskers extend to the min and max values for a data set and not show the outliers. I've found the method to hide the outliers but I have been unable to get the whiskers to extend to the min and max for each group.

a <- data.frame(group = "a", value = rnorm(10))
b <- data.frame(group = "b", value = rnorm(100))
c <- data.frame(group = "c", value = rnorm(1000))

data <- rbind(a, b, c)

ggplot(data, aes(x=group, y=value)) + 
  stat_boxplot(geom ='errorbar') +
  geom_boxplot() #geom_boxplot(outlier.shape = NA)

Q: What is the correct way to setup ggplot2 boxplots so that the whiskers extend to the min and max?


lolcodez
  • 659
  • 4
  • 9
  • 16
  • Have you taken a look at this question [Changing whisker definition in geom_boxplot](http://stackoverflow.com/questions/4765482/changing-whisker-definition-in-geom-boxplot)? – LJW Nov 13 '14 at 23:16
  • That answer to that question does extend the range for the boxplots to the min and max, however, the error bars for the whiskers don't appear to follow it, leaving the range bars far beyond the error bars. – lolcodez Nov 13 '14 at 23:38

2 Answers2

3

Following LJW's comment I think this is what you want:

a <- data.frame(group = "a", value = rnorm(10))
b <- data.frame(group = "b", value = rnorm(100))
c <- data.frame(group = "c", value = rnorm(1000))

data <- rbind(a, b, c)

o <- function(x) {
  subset(x, x == max(x) | x == min(x))
}

f <- function(x) {
  r <- quantile(x, probs = c(0.00, 0.25, 0.5, 0.75, 1))
  names(r) <- c("ymin", "lower", "middle", "upper", "ymax")
  r
}

ggplot(data, aes(x=group, y=value)) + 
  stat_summary(fun.data=f, geom="boxplot") + 
  stat_summary(fun.y = o, geom="point") +
  stat_boxplot(geom='errorbar',coef=10) #just give an arbitrarily big number here

UPDATE You can add the whiskers with the coef argument in the stat_boxplot function:

enter image description here

LyzandeR
  • 37,047
  • 12
  • 77
  • 87
  • Thanks for the reply. This does extend the range out correctly, but the error bars do not follow, leaving the range extended far beyond the error bars. (i.e stat_boxplot(geom ='errorbar')) – lolcodez Nov 13 '14 at 23:42
2

If you only want to control the whiskers, there is an easy solution with geom_boxplot as well. The coef argument controls how far the whiskers stretch. It defaults to 1.5, meaning that the whiskers reach out to 1.5*IQR. If you set this value to NULL, the whiskers will stretch out as far as possible, i.e. to the minimum and maximum:

a <- data.frame(group = "a", value = rnorm(10))
b <- data.frame(group = "b", value = rnorm(100))
c <- data.frame(group = "c", value = rnorm(1000))

data <- rbind(a, b, c)

ggplot(data, aes(x=group, y=value)) + 
  stat_boxplot(geom ='errorbar', coef=NULL) +
  geom_boxplot(coef=NULL)
Lukas D. Sauer
  • 355
  • 2
  • 11