Chapter 5 Faceting Figures
“But let the mind beware, that though the flesh be bugged, the circumstances of existence are pretty glorious.”
— Kurt Vonnegut, Player Piano
“You miss 100% of the shots you don’t take.”
— Wayne Gretzky
So far we have only looked at single panel figures. But as you may have guessed by now, ggplot2
is capable of creating any sort of data visualisation that a human mind could conceive. This may seem like a grandiose assertion, but we’ll see if we can’t convince you of it by the end of this course. For now however, let’s just take our understanding of the usability of ggplot2
two steps further by first learning how to facet a single figure, and then stitch different types of figures together into a grid. In order to aid us in this process we will make use of an additional package, ggpubr
. The purpose of this package is to provide a bevy of additional tools that researchers commonly make use of in order to produce publication quality figures. Note that library(ggpubr)
will not work on your computer if you have not yet installed the package.
# Load libraries
library(tidyverse)
library(ggpubr)
5.1 Faceting one figure
Faceting a single figure is built into ggplot2
from the ground up and will work with virtually anything that could be passed to the aes()
function. Here we see how to create an individual facet for each Diet
within the ChickWeight
dataset.
# Load data
ChickWeight <- datasets::ChickWeight
# Create faceted figure
ggplot(data = ChickWeight, aes(x = Time, y = weight, colour = Diet)) +
geom_point() +
geom_smooth(method = "lm") + # Note the `+` sign here
facet_wrap(~Diet, ncol = 2) + # This is the line that creates the facets
labs(x = "Days", y = "Mass (g)")
5.2 New figure types
Before we can create a gridded figure of several smaller figures, we need to learn how to create a few new types of figures first. The code for these different types is shown below. Some of the figure types we will learn how to use now do not work well with the full ChickWeight
dataset. Rather we will want only the weights from the final day of collection. To filter only these data we will need to use a bit of the ‘tidy’ code we saw on Day 1.
ChickLast <- ChickWeight %>%
filter(Time == 21)
5.2.1 Line graph
line_1 <- ggplot(data = ChickWeight, aes(x = Time, y = weight, colour = Diet)) +
geom_point() +
geom_line(aes(group = Chick)) +
labs(x = "Days", y = "Mass (g)")
line_1
5.2.2 Linear model
lm_1 <- ggplot(data = ChickWeight, aes(x = Time, y = weight, colour = Diet)) +
geom_point() +
geom_smooth(method = "lm") +
labs(x = "Days", y = "Mass (g)")
lm_1
5.2.3 Histogram
# Note that we are using 'ChickLast', not 'ChickWeight'
histogram_1 <- ggplot(data = ChickLast, aes(x = weight)) +
geom_histogram(aes(fill = Diet), position = "dodge", binwidth = 100) +
labs(x = "Final Mass (g)", y = "Count")
histogram_1
5.2.4 Boxplot
# Note that we are using 'ChickLast', not 'ChickWeight'
box_1 <- ggplot(data = ChickLast, aes(x = Diet, y = weight)) +
geom_boxplot(aes(fill = Diet)) +
labs(x = "Diet", y = "Final Mass (g)")
box_1
5.3 Gridding figures
With these four different figures created we may now look at how to combine them. By visualising the data in different ways they are able to tell us different parts of the same story. What do we see from the figures below that we may not have seen when looking at each figure individually?
ggarrange(line_1, lm_1, histogram_1, box_1,
ncol = 2, nrow = 2, # Set number of rows and columns
labels = c("A", "B", "C", "D"), # Label each figure
common.legend = TRUE) # Create common legend
The above figure looks great, so let’s save a copy of it as a PDF to our computer. In order to do so we will need to assign our figure to an object and then use the ggsave()
function on that object.
# First we must assign the code to an object name
grid_1 <- ggarrange(lm_1, histogram_1, density_1, violin_1,
ncol = 2, nrow = 2,
labels = c("A", "B", "C", "D"),
common.legend = TRUE)
# Then we save the object we created
ggsave(plot = grid_1, filename = "figures/grid_1.pdf")