Une version actualisée de ce chapitre est disponible sur guide-R : Graphiques avec ggplot2

Ce chapitre est évoqué dans le webin-R #14 (exemples de graphiques avancés - 2) sur YouTube.

Vous savez réaliser des graphiques avec ggplot2 ? Il est très facile de combiner plusieurs graphiques en un seul.

Commençons par créer quelques graphiques avec ggplot2.

library(ggplot2)
p1 <- ggplot(mtcars, aes(wt, mpg)) +
  geom_point()
p2 <- ggplot(mtcars, aes(factor(cyl))) +
  geom_bar()
p3 <- ggplot(mtcars, aes(factor(cyl), mpg)) +
  geom_violin()
p4 <- ggplot(mtcars, aes(factor(cyl), mpg)) +
  geom_boxplot()

plot_grid (cowplot)

L’extension cowplot propose une fonction plot_grid. Son usage est expliqué en détail dans les vignettes dédiées inclues avec l’extension : https://wilkelab.org/cowplot/.

library(cowplot)

Attachement du package : 'cowplot'
L'objet suivant est masqué depuis 'package:ggpubr':

    get_legend
L'objet suivant est masqué depuis 'package:lubridate':

    stamp
L'objet suivant est masqué depuis 'package:JLutils':

    get_legend
# simple grid
plot_grid(p1, p2, p3, p4)

# simple grid with labels and aligned plots
plot_grid(p1, p2, p3, p4, labels = c("A", "B", "C", "D"), align = "hv")

# manually setting the number of rows, auto-generate upper-case labels
plot_grid(p1, p2, p3, nrow = 3, labels = "AUTO", label_size = 12, align = "v")

# making rows and columns of different widths/heights
plot_grid(p1, p2, p3, p4, align = "hv", rel_heights = c(2, 1), rel_widths = c(1, 2))

On notera en passant que le chargement de cowplot modifie le style par défaut des graphiques ggplot2. Voir https://cran.r-project.org/web/packages/cowplot/vignettes/introduction.html.

patchwork

Citons également l’extension patchwork, disponible sur GitHub (https://github.com/thomasp85/patchwork) qui propose une syntaxe un petit peu différente, par addition de graphiques.

library(patchwork)

Attachement du package : 'patchwork'
L'objet suivant est masqué depuis 'package:cowplot':

    align_plots
p1 + (p2 + p3) + p4 + plot_layout(ncol = 1)

multiplot (JLutils)

Dans son ouvrage Cookbook for R, Winston Chang propose une fonction multiplot pour combiner plusieurs graphiques1

L’extension JLutils disponible sur GitHub propose une version améliorée de cette fonction.

Pour installer JLutils si non disponible sur votre PC, copier/coller le code ci-dessous.

if (!require(devtools)) {
  install.packages("devtools")
  library(devtools)
}
install_github("larmarange/JLutils")

Parce que quelques exemples valent mieux qu’un long discours.

library(JLutils)
multiplot(p1, p2, p3, p4)

multiplot(p1, p2, p3, p4, cols = 2)

multiplot(p1, p2, p3, layout = matrix(c(1, 2, 3, 3), nrow = 2))

multiplot(p1, p2, p3, layout = matrix(c(1, 2, 3, 3), nrow = 2, byrow = TRUE))

multiplot(p1, p2, p3, layout = matrix(c(1, 2, 3, 3), nrow = 2, byrow = TRUE), heights = c(3, 1))

Légende partagée entre plusieurs graphiques

JLutils et cowplot fournissent tous deux une fonction get_legend permettant d’extraire la légende d’un graphique puis de l’utiliser avec multiplot ou plot_grid.

Créons quelques graphiques.

dsamp <- diamonds[sample(nrow(diamonds), 1000), ]
p1 <- qplot(carat, price, data = dsamp, colour = clarity) +
  theme(plot.margin = unit(c(6, 0, 6, 0), "pt"))
Warning: `qplot()` was deprecated in ggplot2 3.4.0.
p2 <- qplot(depth, price, data = dsamp, colour = clarity) +
  theme(plot.margin = unit(c(6, 0, 6, 0), "pt")) + ylab("")
p3 <- qplot(color, price, data = dsamp, colour = clarity) +
  theme(plot.margin = unit(c(6, 0, 6, 0), "pt")) + ylab("")

Récupérons la légende du premier graphique graphique puis supprimons là dans les trois graphiques.

leg <- get_legend(p1)
p1 <- p1 + theme(legend.position = "none")
p2 <- p2 + theme(legend.position = "none")
p3 <- p3 + theme(legend.position = "none")

Combinons le tout.

multiplot(p1, p2, p3, leg, cols = 2)

plot_grid(p1, p2, p3, leg, ncol = 2)

Enfin, citons également la fonction grid_arrange_shared_legend de l’extension lemon2.


  1. Voir http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/.↩︎

  2. lemon fournit également diverses fonctions pour manipuler des graphiques ggplot2, comme par exemple la possibilité de répéter les axes quand on utilise des facettes.↩︎