ggplot2 facet : split a plot into a matrix of panels

The facet approach partitions a plot into a matrix of panels. Each panel shows a different subset of the data. This R tutorial describes how to split a graph using ggplot2 package.

There are two main functions for faceting :

  • facet_grid()
  • facet_wrap()


ToothGrowth data is used in the following examples.

# Convert dose from numeric to factor variables
ToothGrowth$dose <- as.factor(ToothGrowth$dose)
df <- ToothGrowth
##    len supp dose
## 1  4.2   VC  0.5
## 2 11.5   VC  0.5
## 3  7.3   VC  0.5
## 4  5.8   VC  0.5
## 5  6.4   VC  0.5
## 6 10.0   VC  0.5

Make sure that the variable dose is converted as a factor using the above R script.

Basic box plot

Create a basic box plot filled by groups :

bp <- ggplot(df, aes(x=dose, y=len, group=dose)) + 

ggplot2 facet and R software

Facet with one variable

The graph is partitioned in multiple panels by levels of the group “supp”:

# Split in vertical direction
bp + facet_grid(supp ~ .)
# Split in horizontal direction
bp + facet_grid(. ~ supp)

ggplot2 facet and R softwareggplot2 facet and R software

Facet with two variables

The graph is partitioned by the levels of the groups “dose” and “supp” :

# Facet by two variables: dose and supp.
# Rows are dose and columns are supp
bp + facet_grid(dose ~ supp)
# Facet by two variables: reverse the order of the 2 variables
# Rows are supp and columns are dose
bp + facet_grid(supp ~ dose)

ggplot2 facet and R softwareggplot2 facet and R software

Note that, you can use the argument margins to add additional facets which contain all the data for each of the possible values of the faceting variables

bp + facet_grid(dose ~ supp, margins=TRUE)

ggplot2 facet and R software

Facet scales

By default, all the panels have the same scales (scales="fixed"). They can be made independent, by setting scales to free, free_x, or free_y.

bp + facet_grid(dose ~ supp, scales='free')

ggplot2 facet and R software

As you can see in the above plot, y axis have different scales in the different panels.

Facet labels

The argument labeller can be used to control the labels of the panels :

bp + facet_grid(dose ~ supp, labeller=label_both)

ggplot2 facet and R software

The appearance of facet labels can be modified as follow :

# Change facet text font. Possible values for the font style:
  #'plain', 'italic', 'bold', 'bold.italic'.
bp + facet_grid(dose ~ supp)+
    theme(strip.text.x = element_text(size=12, color="red",
          strip.text.y = element_text(size=12, color="red",
# Change the apperance of the rectangle around facet label
bp + facet_grid(dose ~ supp)+
 theme(strip.background = element_rect(colour="black", fill="white", 
                                       size=1.5, linetype="solid"))

ggplot2 facet and R softwareggplot2 facet and R software


Facets can be placed side by side using the function facet_wrap() as follow :

bp + facet_wrap(~ dose)
bp + facet_wrap(~ dose, ncol=2)

ggplot2 facet and R softwareggplot2 facet and R software


This analysis has been performed using R software (ver. 3.1.2) and ggplot2 (ver. 1.0.0)

Enjoyed this article? I’d be very grateful if you’d help it spread by emailing it to a friend, or sharing it on Twitter, Facebook or Linked In.

Show me some love with the like buttons below... Thank you and please don't forget to share and comment below!!
Avez vous aimé cet article? Je vous serais très reconnaissant si vous aidiez à sa diffusion en l'envoyant par courriel à un ami ou en le partageant sur Twitter, Facebook ou Linked In.

Montrez-moi un peu d'amour avec les like ci-dessous ... Merci et n'oubliez pas, s'il vous plaît, de partager et de commenter ci-dessous!

This page has been seen 549126 times