R Programming

boxplot() in R: How to Make BoxPlots Learn with Example

You can use the geometric object geom_boxplot() from ggplot2 library to draw a boxplot() in R. Boxplots() in R helps to visualize the distribution of the data by quartile and detect the presence of outliers.

We will use the airquality dataset to introduce boxplot() in R with ggplot. This dataset measures the airquality of New York from May to September 1973. The dataset contains 154 observations. We will use the following variables:

  • Ozone: Numerical variable
  • Wind: Numerical variable
  • Month: May to September. Numerical variable

In this tutorial, you will learn

  • Create Box Plot
  • Box Plot with dots
  • Control aesthetic of the Box Plot
  • Box Plot with Jittered dots
  • Notched box plot

Create Box Plot

Before you start to create your first boxplot() in R, you need to manipulate the data as follow:

  • Step 1: Import the data
  • Step 2: Drop unnecessary variables
  • Step 3: Convert Month in factor level
  • Step 4: Create a new categorical variable dividing the month with three level: begin, middle and end.
  • Step 5: Remove missing observations

All these steps are done with dplyr and the pipeline operator %>%.

library(dplyr)
library(ggplot2)
# Step 1
data_air <- airquality % > %

#Step 2
select(-c(Solar.R, Temp)) % > %

#Step 3
mutate(Month = factor(Month, order = TRUE, labels = c("May", "June", "July", "August", "September")), 
       
#Step 4 
day_cat = factor(ifelse(Day < 10, "Begin", ifelse(Day < 20, "Middle", "End"))))

A good practice is to check the structure of the data with the function glimpse().

glimpse(data_air)

Output:

## Observations: 153
## Variables: 5
## $ Ozone   <int> 41, 36, 12, 18, NA, 28, 23, 19, 8, NA, 7, 16, 11, 14, ...
## $ Wind    <dbl> 7.4, 8.0, 12.6, 11.5, 14.3, 14.9, 8.6, 13.8, 20.1, 8.6...
## $ Month   <ord> May, May, May, May, May, May, May, May, May, May, May,...
## $ Day     <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,...
## $ day_cat <fctr> Begin, Begin, Begin, Begin, Begin, Begin, Begin, Begi...

There are NA’s in the dataset. Removing them is wise.

# Step 5
data_air_nona <-data_air %>% na.omit()	

Basic box plot

Let’s plot the basic R boxplot() with the distribution of ozone by month.

# Store the graph
box_plot <- ggplot(data_air_nona, aes(x = Month, y = Ozone))
# Add the geometric object box plot
box_plot +
    geom_boxplot()

Code Explanation

  • Store the graph for further use
    • box_plot: You store the graph into the variable box_plot It is helpful for further use or avoid too complex line of codes
  • Add the geometric object of R boxplot()
    • You pass the dataset data_air_nona to ggplot boxplot.
    • Inside the aes() argument, you add the x-axis and y-axis.
    • The + sign means you want R to keep reading the code. It makes the code more readable by breaking it.
    • Use geom_boxplot() to create a box plot

Output:

Change side of the graph

You can flip the side of the graph.

box_plot +
  geom_boxplot()+
  coord_flip()

Code Explanation

  • box_plot: You use the graph you stored. It avoids rewriting all the codes each time you add new information to the graph.
  • geom_boxplot(): Create boxplots() in R
  • coord_flip(): Flip the side of the graph

Output:

Change color of outlier

You can change the color, shape and size of the outliers.

box_plot +
    geom_boxplot(outlier.colour = "red",
        outlier.shape = 2,
        outlier.size = 3) +
    theme_classic()

Code Explanation

  • outlier.colour=”red”: Control the color of the outliers
  • outlier.shape=2: Change the shape of the outlier. 2 refers to triangle
  • outlier.size=3: Change the size of the triangle. The size is proportional to the number.

Output:

Add a summary statistic

You can add a summary statistic to the R boxplot().

box_plot +
    geom_boxplot() +
    stat_summary(fun.y = mean,
        geom = "point",
        size = 3,
        color = "steelblue") +
    theme_classic()

Code Explanation

  • stat_summary() allows adding a summary to the horizontal boxplot R
  • The argument fun.y controls the statistics returned. You will use mean
  • Note: Other statistics are available such as min and max. More than one statistics can be exhibited in the same graph
  • geom = “point”: Plot the average with a point
  • size=3: Size of the point
  • color =”steelblue”: Color of the points

Output:

Box Plot with Dots

In the next horizontal boxplot R, you add the dot plot layers. Each dot represents an observation.

box_plot +
    geom_boxplot() +
    geom_dotplot(binaxis = 'y',
        dotsize = 1,
        stackdir = 'center') +
    theme_classic()

Code Explanation

  • geom_dotplot() allows adding dot to the bin width
  • binaxis=’y’: Change the position of the dots along the y-axis. By default, x-axis
  • dotsize=1: Size of the dots
  • stackdir=’center’: Way to stack the dots: Four values:
    • “up” (default),
    • “down”
    • “center”
    • “centerwhole”

Output:

Control Aesthetic of the Box Plot

Change the color of the box

You can change the colors of the group.

ggplot(data_air_nona, aes(x = Month, y = Ozone, color = Month)) +
    geom_boxplot() +
    theme_classic()

Code Explanation

  • The colors of the groups are controlled in the aes() mapping. You can use color= Month to change the color of the box and whisker plot according to the months

Output:

Box plot with multiple groups

It is also possible to add multiple groups. You can visualize the difference in the air quality according to the day of the measure.

ggplot(data_air_nona, aes(Month, Ozone)) +
    geom_boxplot(aes(fill = day_cat)) +
    theme_classic()

Code Explanation

  • The aes() mapping of the geometric object controls the groups to display (this variable has to be a factor)
  • aes(fill= day_cat) allows creating three boxes for each month in the x-axis

Output:

Box Plot with Jittered Dots

Another way to show the dot is with jittered points. It is a convenient way to visualize points with boxplot for categorical data in R variable.

This method avoids the overlapping of the discrete data.

box_plot +
    geom_boxplot() +
    geom_jitter(shape = 15,
        color = "steelblue",
        position = position_jitter(width = 0.21)) +
    theme_classic()

Code Explanation

  • geom_jitter() adds a little decay to each point.
  • shape=15 changes the shape of the points. 15 represents the squares
  • color = “steelblue”: Change the color of the point
  • position=position_jitter(width = 0.21): Way to place the overlapping points. position_jitter(width = 0.21) means you move the points by 20 percent from the x-axis. By default, 40 percent.

Output:

You can see the difference between the first graph with the jitter method and the second with the point method.

box_plot +
    geom_boxplot() +
    geom_point(shape = 5,
        color = "steelblue") +
    theme_classic()

Notched Box Plot

An interesting feature of geom_boxplot(), is a notched boxplot function in R. The notch plot narrows the box around the median. The main purpose of a notched box plot is to compare the significance of the median between groups. There is strong evidence two groups have different medians when the notches do not overlap. A notch is computed as follow:

with is the interquartile and number of observations.

box_plot +
    geom_boxplot(notch = TRUE) +
    theme_classic()

Code Explanation

  • geom_boxplot(notch=TRUE): Create a notched horizontal boxplot R

Output:

Summary

We can summarize the different types of horizontal boxplot R in the table below:

Objective Code
Basic box plot
ggplot(df, aes( x = x1, y =y)) + geom_boxplot()
flip the side
ggplot(df, aes( x = x1, y =y)) + geom_boxplot() + coord_flip()
Notched box plot
ggplot(df, aes( x = x1, y =y)) + geom_boxplot(notch=TRUE)
Box plot with jittered dots
ggplot(df, aes( x = x1, y =y)) + geom_boxplot() + geom_jitter(position = position_jitter(0.21))
Related Articles