Customizing boxplots with ggplot2

Boxplot is probably one of the most common type of graphics. This will show how to customize boxplots.

You will learn,

  • how to change the order of labels

  • how to change the colours

  • how to flip coordinates

Step 1: we create a simple data set.

Gender <- rep(c("Male", "Female"), times = 3, each = 4)
Quality <- rep(c("Taste", "Color of package", "Capacity"), times = 1, each = 8)
Accepted <- seq(0, 100, by = 100/23)

DF <- data.frame(Gender, Quality, Accepted)
head(DF)
##   Gender Quality  Accepted
## 1   Male   Taste  0.000000
## 2   Male   Taste  4.347826
## 3   Male   Taste  8.695652
## 4   Male   Taste 13.043478
## 5 Female   Taste 17.391304
## 6 Female   Taste 21.739130

Step 2: Generate a simple boxplot with ggplot

library(ggplot2)
ggplot(DF, aes(x = Quality, y = Accepted, fill = Gender)) +
  geom_boxplot() 

Step 3: Change the colours, legend position and x-axis order

ggplot(DF, aes(x = Quality, y = Accepted, fill = Gender)) +
  geom_boxplot() +
  scale_fill_manual(values = c("green", "orange")) +
  xlab("") +
  theme(legend.position = "top", legend.title = element_blank()) + 
  scale_x_discrete(limits=c("Taste", "Color of package", "Capacity"))

Step 4: Change the plotting order: first you have to include factor code to set the order of the levels.

DF$Gender_factor <- factor(DF$Gender, levels=c("Male", "Female"))
ggplot(DF, aes(x = Quality, y = Accepted, fill = Gender_factor)) +
  geom_boxplot() +
  scale_fill_manual(values = c("green", "orange")) +
  xlab("") +
  theme(legend.position = "top", legend.title = element_blank()) + 
  scale_x_discrete(limits=c("Taste", "Color of package", "Capacity"))

Step 5: Horizontal bar chart: coord_flip()

ggplot(DF, aes(x = Quality, y = Accepted, fill = Gender)) +
  geom_boxplot() +
  scale_fill_manual(values = c("green", "orange")) +
  xlab("") +
  theme(legend.position = "top", legend.title = element_blank()) + 
  coord_flip()+
  scale_x_discrete(limits=c("Taste", "Color of package", "Capacity"))

step 6: Change the legend order similar to plot order: under themes fill=guide_legend(reverse=FALSE)

ggplot(DF, aes(x = Quality, y = Accepted, fill = Gender)) +
  geom_boxplot() +
  scale_fill_manual(values = c("green", "orange")) +
  xlab("") +
  theme(legend.position = "top", legend.title = element_blank()) + 
  guides(fill=guide_legend(reverse=TRUE)) +
  coord_flip()+
  scale_x_discrete(limits=c("Taste", "Color of package", "Capacity"))