ggplot2 - Combiner plusieurs graphiques sur la même page - Logiciel R et visualisation de données


Pour combiner plusieurs graphes de ggplot2 sur la même page, les fonctions standard de R - par() et layout() - ne peuvent être utilisées.

Ce tutoriel R va vous montrer, étape par étape, comment mettre plusieurs ggplots sur une seule page.

Les fonctions grid.arrange()[dans le package gridExtra] et plot_grid()[dans le package cowplot], seront utilisées.

Installer et charger les packages nécessaires

Installer et charger le package gridExtra

install.packages("gridExtra")
library("gridExtra")

Installer et charger le package cowplot

cowplot peut être installé comme suit:

install.packages("cowplot")

OU

comme suit en utilisant le package devtools (devtools devrait être installé avant d’utiliser le code ci-dessous):

devtools::install_github("wilkelab/cowplot")

Charger cowplot:

library("cowplot")

Préparer des données

Le jeu de données ToothGrowth peut être utilisé :

df <- ToothGrowth
# Convertir la colonne dose en facteur
df$dose <- as.factor(df$dose)
head(df)
##    len supp dose
## 1  4.2   VC  0.5
## 2 11.5   VC  0.5
## 3  7.3   VC  0.5
## 4  5.8   VC  0.5
## 5  6.4   VC  0.5
## 6 10.0   VC  0.5

Cowplot: Graphs prêt-à-publier

Le package cowplot est une extension de ggplot2 et il peut être utiliser pour générer des graphiques prêt-à-publier.

Graph simples

library(cowplot)
# Graphe par défaut
bp <- ggplot(df, aes(x=dose, y=len, color=dose)) +
  geom_boxplot() + 
  theme(legend.position = "none")
bp
# Ajouter les grilles
bp + background_grid(major = "xy", minor = "none")

Rappelons que, la fonction ggsave() [dans le package ggplot2] peut être utilisée pour enregistrer des ggplots. Cependant, lorsque l’on travaille avec cowplot, la fonction save_plot() [dans le package cowplot] est préférée. Il est une alternative à ggsave avec un meilleur support pour les graphiques multi-figures.

save_plot("mpg.pdf", plot.mpg,
      base_aspect_ratio = 1.3 #Laisser de la place pour la légende
          )

Combiner plusieurs graphes en utilisant cowplot

# Nuage de points
sp <- ggplot(mpg, aes(x = cty, y = hwy, colour = factor(cyl)))+ 
  geom_point(size=2.5)
sp
# Bar plot
bp <- ggplot(diamonds, aes(clarity, fill = cut)) +
  geom_bar() +
  theme(axis.text.x = element_text(angle=70, vjust=0.5))
bp

Combiner deux graphiques (nuage de points et bar plot):

plot_grid(sp, bp, labels=c("A", "B"), ncol = 2, nrow = 1)

La fonction draw_plot() peut être utilisée pour placer des graphiques dans des sites spécifiques avec une taille particulière. Le format de la fonction est la suivante:

draw_plot(plot, x = 0, y = 0, width = 1, height = 1)
  • plot: Le graphique à placer (ggplot2 ou un gtable)
  • x: L’abscisse x du coin inférieur gauche du graphique
  • y: L’ordonnée y du coin inférieur gauche du graphique
  • width, height: la largeur et la hauteur du graphique

La fonction ggdraw() est utilisée pour initialiser le graphique.

plot.iris <- ggplot(iris, aes(Sepal.Length, Sepal.Width)) + 
  geom_point() + facet_grid(. ~ Species) +
  stat_smooth(method = "lm") +
  background_grid(major = 'y', minor = "none") + # grilles horiz.
  panel_border() # Bordure autour de chaque panel
ggdraw() +
  draw_plot(plot.iris, 0, .5, 1, .5) +
  draw_plot(sp, 0, 0, .5, .5) +
  draw_plot(bp, .5, 0, .5, .5) +
  draw_plot_label(c("A", "B", "C"), c(0, 0, 0.5), c(1, 0.5, 0.5), size = 15)

grid.arrange: Créer et organiser plusieurs graphiques

Le code R ci-dessous, crée un box plot, un dot plot, un violin plot et un stripchart (jitter plot) :

library(ggplot2)
# Créer un box plot
bp <- ggplot(df, aes(x=dose, y=len, color=dose)) +
  geom_boxplot() + 
  theme(legend.position = "none")
# Créer un dot plot
# Ajouter la moyenne et l'écart type
dp <- ggplot(df, aes(x=dose, y=len, fill=dose)) +
  geom_dotplot(binaxis='y', stackdir='center')+
  stat_summary(fun.data=mean_sdl, fun.args = list(mult=1), 
                 geom="pointrange", color="red")+
   theme(legend.position = "none")
# Créer un violin plot
vp <- ggplot(df, aes(x=dose, y=len)) +
  geom_violin()+
  geom_boxplot(width=0.1)
# Créer un stripchart
sc <- ggplot(df, aes(x=dose, y=len, color=dose, shape=dose)) +
  geom_jitter(position=position_jitter(0.2))+
  theme(legend.position = "none") +
  theme_gray()

Combiner les graphiques en utilisant la fonction grid.arrange() [dans gridExtra] :

library(gridExtra)
grid.arrange(bp, dp, vp, sc, ncol=2, nrow = 2)

Ajouter une légende commune pour plusieurs graphiques ggplot2

Ceci peut être réalisé en quatre étapes:

  1. Créer les graphiques : p1, p2, ….
  2. Enregistrer la légende du graphique p1 comme un élément graphique externe (appelé “grob” dans la terminologie Grid)
  3. Retirer les légendes de tous les graphiques
  4. Dessiner l’ensemble des graphiques avec seulement une légende dans le panel de droite

Pour enregistrer la légende d’un ggplot, la fonction d’aide ci-dessous peut être utilisée:

library(gridExtra)
get_legend<-function(myggplot){
  tmp <- ggplot_gtable(ggplot_build(myggplot))
  leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
  legend <- tmp$grobs[[leg]]
  return(legend)
}

(La fonction ci-dessus est dérivée de ce forum. )

# 1. Créer les graphiques
#++++++++++++++++++++++++++++++++++
# Créer un box plot
bp <- ggplot(df, aes(x=dose, y=len, color=dose)) +
  geom_boxplot()
# Créer un violin plot
vp <- ggplot(df, aes(x=dose, y=len, color=dose)) +
  geom_violin()+
  geom_boxplot(width=0.1)+
  theme(legend.position="none")
# 2. Enregistrer la légende
#+++++++++++++++++++++++
legend <- get_legend(bp)
# 3. Supprimer la légende du box plot
#+++++++++++++++++++++++
bp <- bp + theme(legend.position="none")
# 4. Combiner les graphiques avec des tailles spécifiques
grid.arrange(bp, vp, legend, ncol=3, widths=c(2.3, 2.3, 0.8))

Nuage de point avec courbe de distribution marginale

Step 1/3. Créer des données:

set.seed(1234)
x <- c(rnorm(500, mean = -1), rnorm(500, mean = 1.5))
y <- c(rnorm(500, mean = 1), rnorm(500, mean = 1.7))
group <- as.factor(rep(c(1,2), each=500))
df2 <- data.frame(x, y, group)
head(df2)
##             x          y group
## 1 -2.20706575 -0.2053334     1
## 2 -0.72257076  1.3014667     1
## 3  0.08444118 -0.5391452     1
## 4 -3.34569770  1.6353707     1
## 5 -0.57087531  1.7029518     1
## 6 -0.49394411 -0.9058829     1

Step 2/3. Créer des graphiques:

# Nuage de points colorés par groupes
scatterPlot <- ggplot(df2,aes(x, y, color=group)) + 
  geom_point() + 
  scale_color_manual(values = c('#999999','#E69F00')) + 
  theme(legend.position=c(0,1), legend.justification=c(0,1))
# Courbe de densité marginale de x (panel du haut)
xdensity <- ggplot(df2, aes(x, fill=group)) + 
  geom_density(alpha=.5) + 
  scale_fill_manual(values = c('#999999','#E69F00')) + 
  theme(legend.position = "none")
# Courbe de densité marginale de y (panel de droite)
ydensity <- ggplot(df2, aes(y, fill=group)) + 
  geom_density(alpha=.5) + 
  scale_fill_manual(values = c('#999999','#E69F00')) + 
  theme(legend.position = "none")

Créer un emplacement vide:

blankPlot <- ggplot()+geom_blank(aes(1,1))+
  theme(
    plot.background = element_blank(), 
   panel.grid.major = element_blank(),
   panel.grid.minor = element_blank(), 
   panel.border = element_blank(),
   panel.background = element_blank(),
   axis.title.x = element_blank(),
   axis.title.y = element_blank(),
   axis.text.x = element_blank(), 
   axis.text.y = element_blank(),
   axis.ticks = element_blank(),
   axis.line = element_blank()
     )

Step 3/3. Regrouper les graphiques:

Organiser le graphique avec des largeurs et des hauteurs adaptées pour chaque ligne et chaque colonne:

library("gridExtra")
grid.arrange(xdensity, blankPlot, scatterPlot, ydensity, 
        ncol=2, nrow=2, widths=c(4, 1.4), heights=c(1.4, 4))

Créer une mise en page complexe en utilisant la fonction viewport()

Les différentes étapes sont:

  1. Créer les graphiques: p1, p2, p3, ….
  2. Partir à la page suivante sur le dispositif grid en utilisant la fonction grid.newpage()
  3. Créer une mise en page 2X2 - nombre de colonne = 2; nombre de ligne = 2
  4. Définir une zone de vue (“grid viewport” : une région rectangulaire sur le dispositif graphique)
  5. Afficher le graphique dans le viewport
require(grid)
# Nouvelle page
grid.newpage()
# Créer la mise en page : nrow = 2, ncol = 2
pushViewport(viewport(layout = grid.layout(2, 2)))
# Une fonction pour definir une region dans la mise en page
define_region <- function(row, col){
  viewport(layout.pos.row = row, layout.pos.col = col)
} 
# Arranger les graphiques
print(scatterPlot, vp=define_region(1, 1:2))
print(xdensity, vp = define_region(2, 1))
print(ydensity, vp = define_region(2, 2))

Insérez un élément graphique externe dans un ggplot

La fonction annotation_custom() [dans ggplot2] peut être utilisée pour ajouter des tables, des graphiques ou d’autres éléments du système graphique “grid”. Le format simplifié est:

annotation_custom(grob, xmin, xmax, ymin, ymax)

  • grob: L’élément externe graphique à afficher
  • xmin, xmax : location x exprimée dans les coordonnées de données (location horizontale)
  • ymin, ymax : location x exprimée dans les coordonnées de données (location verticale)


Les différentes étapes sont:

  1. Créer un nuage de points de y = f(x)
  2. Ajouter, par exemple, le box plot de x et de y à l’intérieur du nuage de points en utilisant la fonction annotation_custom()

Comme le box plot intérieur chevauche avec certains points, un fond transparent est utilisé pour les box plots.

# Créer un thème transparent
transparent_theme <- theme(
 axis.title.x = element_blank(),
 axis.title.y = element_blank(),
 axis.text.x = element_blank(), 
 axis.text.y = element_blank(),
 axis.ticks = element_blank(),
 panel.grid = element_blank(),
 axis.line = element_blank(),
 panel.background = element_rect(fill = "transparent",colour = NA),
 plot.background = element_rect(fill = "transparent",colour = NA))

Créer les graphes:

p1 <- scatterPlot # voir sections précédentes
# Box plot pour la variable x
p2 <- ggplot(df2, aes(factor(1), x))+
  geom_boxplot(width=0.3)+coord_flip()+
  transparent_theme
# Box plot pour la variable y
p3 <- ggplot(df2, aes(factor(1), y))+
  geom_boxplot(width=0.3)+
  transparent_theme
# Créer les éléments graphiques externes 
# ("grob" en termininology grid) 
p2_grob = ggplotGrob(p2)
p3_grob = ggplotGrob(p3)
   
# Inserer p2_grob à l'intérieur du nuage de points
xmin <- min(x); xmax <- max(x)
ymin <- min(y); ymax <- max(y)
p1 + annotation_custom(grob = p2_grob, xmin = xmin, xmax = xmax, 
                       ymin = ymin-1.5, ymax = ymin+1.5)

# Inserer p3_grob à l'intérieur du nuage de points
p1 + annotation_custom(grob = p3_grob,
                       xmin = xmin-1.5, xmax = xmin+1.5, 
                       ymin = ymin, ymax = ymax)

Si vous avez une solution pour insérer, en même temps, à la fois p2_grob et p3_grob à l’intérieur du nuage de points, s’il vous plaît laissez-moi un commentaire. J’ai eu quelques erreurs en essayant de le faire …

Combiner table, texte et graphique ggplot2

Les fonctions ci-dessous sont nécessaires:

  • tableGrob() [dans le package gridExtra] : pour ajouter un tableau de données à un dispositif graphique
  • splitTextGrob() [dans le package RGraphics] : pour ajouter un texte à un graphique

Assurez vous que le package RGraphics est installé.

library(RGraphics)
library(gridExtra)
# Tableau
p1 <- tableGrob(head(ToothGrowth))
# Texte
text <- "ToothGrowth data describes the effect of Vitamin C on tooth growth in Guinea pigs.  Three dose levels of Vitamin C (0.5, 1, and 2 mg) with each of two delivery methods [orange juice (OJ) or ascorbic acid (VC)] are used."
p2 <- splitTextGrob(text)
# Box plot
p3 <- ggplot(df, aes(x=dose, y=len)) + geom_boxplot()
# Combiner les graphiques sur la même page
grid.arrange(p1, p2, p3, ncol=1)

Infos

Cette analyse a été faite en utilisant le logiciel R (ver. 3.2.4) et le package ggplot2 (ver. 2.1.0)







Want to Learn More on R Programming and Data Science?

==> Subscribe to our Mailing List <==

* indicates required


 Get involved :
  Click to follow us on and Google+ :   
  Comment this article by clicking on "Discussion" button (top-right position of this page)
  Sign up as a member and post news and articles on STHDA web site.


Suggestions


ggplot2 couleurs : Changer les couleurs automatiquement et manuellement - Logiciel R et visualisation de données
ggplot2 graduation des axes : Guide pour personnaliser les étiquettes des graduations - Logiciel R et visualisation de données
ggplot2 légende : Modifier facilement la légende d'un graphique - Logiciel R et visualisation de données
ggplot2 barplots : Guide de démarrage rapide - Logiciel R et visualisation de données
ggplot2 échelle et transformation des axes - Logiciel R et visualisation de données
ggplot2 titres : Titre principal, titre des axes et légendes - Logiciel R et visualisation de données
ggplot2 box plot : Guide de démarrage rapide - Logiciel R et visualisation de données
ggplot2 nuage de points: Guide de démarrage rapide - Logiciel R et visualisation de données
ggplot2 textes : Ajouter du texte à un graphique - Logiciel R et visualisation de données
ggplot2 thèmes et couleurs de fond : les 3 éléments - Logiciel R et visualisation de données
ggplot2 barres d'erreur : Guide de démarrage rapide - Logiciel R et visualisation de données
ggplot2 graphique en camembert: Guide de démarrage rapide - Logiciel R et visualisation de données
ggplot2 types de points - Logiciel R et visualisation de données
ggplot2 histogramme : Guide de démarrage rapide - Logiciel R et visualisation de données
ggplot2 - ajouter une ligne droite à un graphe : Ligne horizontale, verticale et droite de régression
ggplot2 graphique linéaire : Guide de démarrage rapide - Logiciel R et visualisation de données
ggplot2
ggplot2 dot plot : Guide de démarrage rapide - Logiciel R et visualisation de données
ggplot2 : heatmap d'une matrice de corrélation - Logiciel R et visualisation de données
ggplot2 type de traits : Comment changer le type de trait d'un graphique avec le logiciel R?
ggplot2 facet : diviser un graphique en plusieurs panneaux - Logiciel R et visualisation de données
ggplot2 ECDF graphique: Guide de démarrage rapide pour la fonction de répartition empirique - Logiciel R et visualisation de données
ggplot2 violin plot : Guide de démarrage rapide - Logiciel R et visualisation de données
ggplot2 courbe de distribution : Guide de démarrage rapide - Logiciel R et visualisation de données
ggplot2 stripchart (jitter): Guide de démarrage rapide - Logiciel R et visualisation de données
ggplot2 pivoter un graphique : Inverser et retourner le graphique - Logiciel R et visualisation de données
ggplot2 qq plot (quantile - quantile plot) : Guide de démarrage rapide - Logiciel R et visualisation de données

Cette page a été vue 16779 fois
Licence - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions
Licence Creative Commons