Combining plots in R

Simple plot combination: mfrow and mfcol

It is straightforward to combine plots in base R with mfrow and mfcol graphical parameters. You just need to specify a vector with the number of rows and the number of columns you want to create. The decision of which graphical parameter you should use depends on how do you want your plots to be arranged:

  • mfrow: the plots will be arranged by rows.
  • mfcol: the plots will be arranged by columns.

mfrow

mfcol

As an example, if you want to combine two plots you just need to type the following:

# Data
x <- rexp(50)

# One row, two columns
par(mfrow = c(1, 2))

# The following two plots will be combined
hist(x, main = "Left plot")     # Left 
boxplot(x, main = "Right plot") # Right

# Back to the original graphics device
par(mfrow = c(1, 1))

Arrange two plots in R with mfrow

If you need to add more rows, modify the vector:

# Data
set.seed(6)
x <- rexp(50)

# Two rows, two columns
par(mfrow = c(2, 2))

# Plots
hist(x, main = "Top left")                   # Top left
boxplot(x, main = "Top right")               # Top right
plot(x, main = "Bottom left")                # Bottom left
pie(table(round(x)), main = "Bottom right")  # Bottom right

# Back to the original graphics device
par(mfrow = c(1, 1))

Plot arrangement in base R

If you prefer your plots to be arranged by column, use the mfcol graphical parameter instead:

# Data
set.seed(6)
x <- rexp(50)

# Two rows, two columns
par(mfcol = c(2, 2))

# Plots
hist(x, main = "Top left")                   # Top left
boxplot(x, main = "Bottom left")             # Bottom left
plot(x, main = "Top right")                  # Top right
pie(table(round(x)), main = "Bottom right")  # Bottom right

# Back to the original graphics device
par(mfcol = c(1, 1))

Arranging plots in R

Complex layouts: layout function

In case you need more complex layouts you can use the layout function. The arguments of the function are the following:

  • mat: a matrix where each value represents the location of the figures.
  • widths: a vector for the widths of the columns. You can also specify them in centimeters with lcm function.
  • heights: a vector for the height of the columns. You can also specify them in centimeters with lcm function.
  • respect: Boolean or a matrix filled with 0 and 1 of the same dimensions as mat to indicate whether to respect relations between widths and heights or not.

Note that you can preview a layout making use of the layout.show function before adding the plots.

l <- layout(matrix(c(1, 2,  # First, second
                     3, 3), # and third plot
            nrow = 2,
            ncol = 2,
            byrow = TRUE))

layout.show(l)

layout.show function to create complex layouts

Example 1: two rows, with two plots on the first and one on the second.

Using the layout we created before, you can add the plots as follows.

mat <- matrix(c(1, 2,  # First, second
                3, 3), # and third plot
              nrow = 2, ncol = 2,
              byrow = TRUE)

layout(mat = mat)

# Data
set.seed(6)
x <- rexp(50)

plot(x)    # First plot
boxplot(x) # Second plot
hist(x)    # Third plot

Complex layouts with layout function in R

Example 2: two rows, with two plots below and one above, being the second row three times higher than the first.

mat <- matrix(c(1, 1,  # First
                2, 3), # second and third plot
              nrow = 2, ncol = 2,
              byrow = TRUE)

layout(mat = mat,
       heights = c(1, 3)) # First and second row
                          # relative heights

# Data
set.seed(6)
x <- rexp(50)

plot(x)    # First row
boxplot(x) # Second row, left
hist(x)    # Second row, right

Example using the layout function in R

Example 3: two columns, with two plots on the right and one on the left, being the second column two times wider than de first.

mat <- matrix(c(1, 2,  # First, second
                1, 3), # first and third plot
              nrow = 2, ncol = 2,
              byrow = TRUE),

layout(mat = mat,
       widths = c(1, 2)) # First and second
                         # column relative widths

# Data
set.seed(6)
x <- rexp(50)

plot(x)    # First column, top
boxplot(x) # First column, bottom
hist(x)    # Second column

Arranging plots with the layout function

Marginal plots

With the layout function you can also add marginal plots to a plot. For that you could do something like the following. Note that you will need to customize several graphical parameters for each plot.

Marginal plots in R with layout function

# Data
set.seed(6)
x <- rexp(50)

layout(matrix(c(2, 0, 1, 3),
              nrow = 2, ncol = 2,
              byrow = TRUE),
       widths = c(3, 1),
       heights  = c(1, 3), respect = TRUE)

# Top and right margin of the main plot
par(mar = c(5.1, 4.1, 0, 0))
plot(x)

# Left margin of the histogram
par(mar = c(0, 4.1, 0, 0))
hist(x, main = "", bty = "n",
     axes = FALSE, ylab = "")

# Bottom margin of the boxplot
par(mar = c(5.1, 0, 0, 0))

# Boxplot without plot region box
par(bty = "n")

# Boxplot without axes
boxplot(x, axes = FALSE)
ggplot2

Elegant Graphics for Data Analysis

Buy on Amazon
Storytelling with Data

A Data Visualization Guide for Business Professionals

Buy on Amazon
Fundamentals of Data Visualization

A Primer on Making Informative and Compelling Figures

Buy on Amazon

See also