How to Use facet_wrap in R (With Examples)

The facet_wrap() function in R is a powerful tool that helps to visualize data in multiple panels, arranged in a grid. It is useful for displaying multiple plots at once, such as in comparing different groups, or displaying one variable across different categories. This function is used in conjunction with ggplot2, and allows users to customize the shape and size of the facets, as well as the labels and the scales associated with each panel. Examples are included to help users gain a better understanding of how to use the facet_wrap() function.


The facet_wrap() function can be used to produce multi-panel plots in ggplot2.

This function uses the following basic syntax:

library(ggplot2)

ggplot(df, aes(x_var, y_var)) +
  geom_point() +
  facet_wrap(vars(category_var))

The following examples show how to use this function with the built-in mpg dataset in R:

#view first six rows of mpg dataset
head(mpg)

manufacturer  model  displ  year  cyl	     trans  drv	cty  hwy  fl	  class
										
audi	         a4    1.8  1999    4	auto(l5)      f	18    29   p	compact
audi	         a4    1.8  1999    4	manual(m5)    f	21    29   p	compact
audi	         a4    2.0  2008    4	manual(m6)    f	20    31   p	compact
audi	         a4    2.0  2008    4	auto(av)      f	21    30   p	compact
audi	         a4    2.8  1999    6	auto(l5)      f	16    26   p	compact
audi	         a4    2.8  1999    6	manual(m5)    f	18    26   p	compact

Example 1: Basic facet_wrap() Function

The following code shows how to create several scatterplots in ggplot2 using displ as the x-axis variable, hwy as the y-axis variable, and class as the grouping variable:

ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  facet_wrap(vars(class))

Example 2: Use Custom Labels

The following code shows how to use the facet_wrap() function with custom labels for the plot titles:

#define custom labels
plot_names <- c('2seater' = "2 Seater",
                'compact' = "Compact Vehicle",
                'midsize' = "Midsize Vehicle",
                'minivan' = "Minivan",
                'pickup' = "Pickup Truck",
                'subcompact' = "Subcompact Vehicle",
                'suv' = "Sport Utility Vehicle")

#use facet_wrap with custom plot labels
ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  facet_wrap(vars(class), labeller = as_labeller(plot_names))

facet_wrap with custom labels in R

Example 3: Use Custom Scales

The following code shows how to use the facet_wrap() function with custom scales for each individual plot:

#use facet_wrap with custom scales
ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  facet_wrap(vars(class), scales='free')

Example 4: Use Custom Order

The following code shows how to use the facet_wrap() function with a custom order for the individual plots:

#define order for plots
mpg <- within(mpg, class <- factor(class, levels=c('compact', '2seater', 'suv',
                                                   'subcompact', 'pickup',
                                                   'minivan', 'midsize')))

#use facet_wrap with custom order
ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  facet_wrap(vars(class))

face_wrap() with custom order in R

Notice that the plots appear in the exact order that we specified.

x