• Skip to primary navigation
  • Skip to main content
  • Skip to primary sidebar

Data Viz with Python and R

Learn to Make Plots in Python and R

  • Home
  • Python Viz
  • Seaborn
  • Altair
  • R Viz
  • ggplot2
  • About
    • Privacy Policy
  • Show Search
Hide Search

4 Ways to have Plots Side by side in ggplot2

datavizpyr · August 19, 2024 ·

In this post, we will learn how to combine two plots side-by-side using four different approaches. First, we will show how we can use facet_wrap() function in ggplot2, if we are interested in similar plots (small multiples) side by side. Next three approaches are more general, i.e. combining any two plots side by side using the R packages patchwork, cowplot, and gridExtra.

Let us get started by loading all the libraries needed.

library(palmerpenguins)
library(tidyverse)
library(cowplot)
library(gridExtra)
library(patchwork)
theme_set(theme_bw(16))

We will use palmer penguins data to make plots and arrange them side by side.

penguins |>
  head()

# A tibble: 6 × 8
  species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
1 Adelie  Torgersen           39.1          18.7               181        3750
2 Adelie  Torgersen           39.5          17.4               186        3800
3 Adelie  Torgersen           40.3          18                 195        3250
4 Adelie  Torgersen           NA            NA                  NA          NA
5 Adelie  Torgersen           36.7          19.3               193        3450
6 Adelie  Torgersen           39.3          20.6               190        3650
# ℹ 2 more variables: sex <fct>, year <int>

side by side with facet_wrap() (small multiples)

When the two or more plots that we want to arrange side by side is of small multiples, we can use facet_wrap() function to arrange them side by side.

penguins |>
  drop_na() |>
  ggplot(aes(x=bill_length_mm, y=flipper_length_mm, color=species))+
  geom_point()+
  facet_wrap(~sex)
ggsave("side_by_side_smal_multiples_plot_ggplot2_facet_wrap.png")
Side by Side plots of small multiples with ggplot2's facet_wrap()
Side by Side plots of small multiples with ggplot2’s facet_wrap()

Let us consider an example, where we have two different types of plots. One is a scatter plot as given below.

p1 <- penguins |>
  drop_na() |>
  ggplot(aes(bill_length_mm,bill_depth_mm, color=species))+
  geom_point()
print(p1)
ggsave("how_to_combine_plots_side_by_side_p1.png")

How to combine two plots side by side
How to combine two plots side by side

And the other is a boxplot as given below.

p2 <- penguins |>
  drop_na() |>
  ggplot(aes(x=species, y= body_mass_g, color=species))+
  geom_boxplot(outlier.shape = NA)+
  geom_jitter(width=0.2)
p2
ggsave("how_to_combine_plots_side_by_side_p2.png")

How to combine two plots side by side
How to combine two plots side by side

We have saved both the plots into two variables, so that it can be reused later.

Side by Side plots with patchwork

One of the ways to combine two plots side by side is to use the R package patchwork’s + function.

p1 +p2
ggsave("side_by_side_plots_ggplot2_patchwork.png")

Combine 2 or more plots side by side with patchwork
Combine 2 or more plots side by side with patchwork

And here is how it looks after arranging them side by side. We can make it better by collecting the legends of the plot and putting them in a common area. We can collect the legends using plot_layout() function as show below.

p1 +p2 + plot_layout(guides = 'collect')
ggsave("side_by_side_plots_common_legends_ggplot2_patchwork.png")
Combine plots side by side with legends in one place using patchwork
Combine plots side by side and collect legends using patchwork

Side by Side plots with cowplot

We can use plot_grid() function in cowplot package to combine two plots side by side.

plot_grid(p1, p2)
ggsave("side_by_side_plots_ggplot2_cowplot_plot_grid.png")
Side by side plots in ggplot2 with cowplot
Side by side plots in ggplot2 with cowplot
legend <- get_legend( p1 ) 
# Combine plot and legend using plot_grid() 
plot_grid(p1+theme(legend.position="none"), 
          p2 +theme(legend.position="none"),
          legend,
          ncol=3)
ggsave("side_by_side_plots_common_legend_ggplot2_cowplot_plot_grid.png")
Combine plots side by side with legends in one place using patchwork
Combine plots side by side and collect legends using patchwork

Side by Side plots with gridExtra

We can also use gridExtra package to arrange plots side by side using grid.arrange() function.

gridExtra::grid.arrange(p1, p2, ncol = 2)

ggsave("side_by_side_plots_ggplot2_gridExtra.png")

Side by side plots in ggplot2 with gridExtra
Side by side plots in ggplot2 with gridExtra

And here is how we can use the grabbed legend shown before to combine the legends in one place with grid.arrange() function in gridExtra.

gridExtra::grid.arrange( p1+theme(legend.position = "none"), 
                         p2+theme(legend.position = "none"), 
                         legend, ncol = 3)

Combine plots side by side with legends in one place using gridExtra
Combine plots side by side with legends in one place using gridExtra

With gridExtra, to save the plot as png file, we have grab the ggplot2 object and pass it to ggsave as shown below.

gridExtra::grid.arrange( p1+theme(legend.position = "none"), 
                         p2+theme(legend.position = "none"), 
                         legend1, ncol = 3)

# Create a grob from the arranged plots
grob <- arrangeGrob( p1+theme(legend.position = "none"), 
                         p2+theme(legend.position = "none"), 
                         legend1, ncol = 3)

# Use ggsave to save the grob
ggsave("side_by_side_with_common_legend_ggplot2_gridExtra.png", grob)


Related posts:

Customizing Mean mark to boxplot with ggplot2How To Show Mean Value in Boxplots with ggplot2? Scatterplot with marginal multi-histogram with ggExtraHow To Make Scatterplot with Marginal Histograms in R? Default ThumbnailHow to Move Facet strip label to the bottom Default ThumbnailHow to change axis tick label size in ggplot2

Filed Under: ggplot2, R Tagged With: side by side plots

Primary Sidebar

Tags

Altair barplot Boxplot boxplot python boxplot with jiitered text labels Bubble Plot Color Palette Countplot Density Plot Facet Plot gganimate ggplot2 ggplot2 Boxplot ggplot2 error ggplot boxplot ggridges ggtext element_markdown() Grouped Barplot R heatmap heatmaps Histogram Histograms Horizontal boxplot Python lollipop plot Maps Matplotlib Pandas patchwork pheatmap Pyhon Python R RColorBrewer reorder boxplot ggplot Ridgeline plot Scatter Plot Scatter Plot Altair Seaborn Seaborn Boxplot Stock Price Over Time Stripplot UpSetR Violinplot Violin Plot World Map ggplot2

Buy Me a Coffee

Copyright © 2025 · Daily Dish Pro on Genesis Framework · WordPress · Log in

Go to mobile version