Mise en forme des graphiques ggplot2

Lorsqu’on commence à employer le package ggplot2 pour visualiser des données, on a rapidement besoin de réaliser quelques mises en forme, comme par exemple modifier les couleurs, ajouter un titre, ajouter du texte, gérer la légende, assembler plusieurs graphiques, ou encore de les exporter.
Dans cet article, je vous propose d’explorer ces éléments.

Mise en forme par la modification des couleurs

Couleurs des points et des lignes

La gestion des couleurs se fait en deux étapes :

  1. Définition de la variable sur laquelle les couleurs vont être appliquées. Cela se réalise dans la couche canevas (la première), à l’intérieur de la fonction `aes()`, en employant l’argument `colour`.
  2. Définition des couleurs elle mêmes, à l’aide de la fonction `scale_colour_manual()`

Dans l’exemple ci-dessous, une couleur est appliquée en fonction de la variable Species :

library(ggplot2)
ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
geom_point() 
scatter plot de base

Pour modifier les couleurs par défaut, on utilisera la couche scale_colour_manual()

ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
geom_point()+
scale_colour_manual(values=c("orange", "blue", "green3")) 
gestion de la couleur des points

Vous pouvez préciser les couleurs en utilisant le code hexadécimal fournit par l’addin colour picker. Pour plus d’informations, consultez mon article : “Choisissez et modifiez très facilement les couleurs de vos graphs R avec Colour Picker“.

Si vous souhaitez appliquer une couleur en fonction d’une variable numérique, vous pouvez employer un gradient de couleurs, à l’aide de la couche, scale_coulour_gradient2():

library(scales)
ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Petal.Length))+ 
  geom_point()+ 
  scale_colour_gradient2(low = muted("red"), mid = "white", high = muted("blue"), midpoint =4.35 ) 

Remarque : pour utiliser la fonction muted(), il est nécessaire de charger le package scales.

Des barres, des boites, des aires

l s’agit du même principe, sauf que l’on emploiera l’argument fill dans la couche canevas, à la place de l’argument colour, et ensuite les fonctions scale_fill_manual() et scale_fill_gradient2(), à la place des fonctions scale_colour_manual() et scale_colour_gradient2()

ggplot(iris, aes(y=Sepal.Length, x=Species, fill=Species))+
geom_jitter()+
geom_boxplot(alpha=0.5) 
boxplot avec les points
ggplot(iris, aes(y=Sepal.Length, x=Species, fill=Species))+
geom_jitter()+
geom_boxplot(alpha=0.5)+
scale_fill_manual(values=c("orange", "blue", "green3")) 

Mise en forme du titre

Nous pouvons facilement ajouter un titre, et un sous-titre en employant la fonction ggtitle().

ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
geom_point()+
scale_colour_manual(values=c("orange", "blue", "green3"))+
ggtitle("Longueur des Sépales en fonction de la largeur", subtitle="Par espèce") 
Titre ggplot2

La modification de l’alignement, de la taille et de la couleur du titre et du sous-titre se réalise dans une couche theme():

ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
  geom_point()+
  scale_colour_manual(values=c("orange", "blue", "green3"))+
  ggtitle("Longueur des Sépales en fonction de la largeur", subtitle="Par espèce")+
  theme(plot.title = element_text(hjust = 0.5, 
                                  size=12,
                                  color="blue",
                                  face="bold"),
        plot.subtitle = element_text(hjust = 0.5,
                                     size=10,
                                     color="green3",
                                     face="italic")) 
Modification du titre ggplot

Pour mettre une partie du texte à la ligne, il suffit d’introduire un `\n` dans la chaîne de caractères :

ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
    geom_point()+
    ggtitle("Longueur des Sépales \n en fonction de la largeur, \n par espèce")+
    theme(plot.title = element_text(hjust = 0.5)) 
Titre sur plusieurs lignes ggplot

Mise en forme des axes

Etiquettes

Les étiquettes des axes peuvent être définies à l’aide des couches `ylab` et `xlab` :

ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
    geom_point()+
    ylab("Longueur des sépales (cm)")+
    xlab("Largeur des sépales (cm)") 

Quadrillage

La taille du quadrillage peut être géré avec les couches scale_x_continuous() et scale_y_continuous() et l’argument breaks:

ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
    geom_point()+
    scale_x_continuous(breaks=seq(2,6,by=0.25))+
    scale_y_continuous(breaks=seq(4,8,by=0.25)) 

Les étiquettes du quadrillage peuvent également être modifiées à l’aide de l’argument labels des fonctions scale_y_continuous et scale_x_continuous. Par exemple, ci-dessous, pour exprimer la longueur des sépales en mm plutôt qu’en cm.

ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
    geom_point()+
    scale_y_continuous(breaks=seq(4,8,by=0.25), labels=seq(40,80,by=2.5))+
    ylab("Longueur des Sépales en mm") 
étiquette des axes ggplot

Certaines fois, pour plus de visibilité, nous pouvons avoir besoin d’appliquer une rotation des étiquettes sur l’axe des x. Cela peut se gérer au niveau de la couche theme() et de l’élément axis.text.x:

ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
    geom_point()+
    scale_x_continuous(breaks=seq(2,6,by=0.25))+
    theme(axis.text.x=element_text(angle=30, hjust=1, vjust=1) 

Pour augmenter rapidement la taille de l’étiquette des axes et du quadrillage (très utile pour l’exportation des plots), vous pouvez employer la fonction element_text(size=rel(2)), comme ceci, par exemple :

ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
    geom_point()+
    scale_x_continuous(breaks=seq(2,6,by=0.25))+
    theme (axis.title= element_text(size=rel(2)),
           axis.text.x = element_text(size=rel(1.5)),
           axis.text.y = element_text(size=rel(1.5))) 
Taille de la police des axes ggplot2

Mise en forme de la légende

Affichage

L‘affichage de la légende peut être géré dans les couches successives, ou de façon plus globale.
Dans le graphique ci-dessous, on peut voir, représenté dans la légende, une boite de boxplot et un point. Cela signifie que les deux couches sont concernées.

ggplot(iris,aes(x=Species, y=Sepal.Length, colour=Species))+
    geom_jitter(width=0.25, height=0)+
    geom_boxplot(alpha=0.25) 
Légende avec ggplot2

Nous allons pouvoir supprimer l’affichage de la légende à partir de la couche geom_jitter(), en utilisant l’argument show.legend=FALSE:

ggplot(iris,aes(x=Species, y=Sepal.Length, colour=Species))+ 
  geom_jitter(width=0.25, height=0, show.legend=FALSE)+ 
  geom_boxplot(alpha=0.25) 

Idem avec la couche geom_boxplot():

ggplot(iris,aes(x=Species, y=Sepal.Length, colour=Species))+
    geom_jitter(width=0.25, height=0, show.legend=FALSE)+
    geom_boxplot(alpha=0.25,show.legend=FALSE) 

Nous aurions pu obtenir le même résultat en utilisant la couche theme(legend.position="none") :

ggplot(iris,aes(x=Species, y=Sepal.Length, colour=Species))+
    geom_jitter(width=0.25, height=0)+
    geom_boxplot(alpha=0.25) +
    theme(legend.position="none") 

Position

Pour changer la position de la légende, nous pouvons employer les options leftrightbottomtop.

ggplot(iris,aes(x=Species, y=Sepal.Length, colour=Species))+
    geom_jitter(width=0.25, height=0)+
    geom_boxplot(alpha=0.25) +
    theme(legend.position="bottom") 
Position de la légende

Titre de la légende

Le titre de la légende peut être modifié en utilisant la fonction labs(). L’argument à employer (color ou fill), dépend de ce qui est employé dans la première couche. Dans l’exemple ci-dessous, on utilisera color :

ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
    geom_point()+
    labs(color="Espèce") 
Changer le nom de la légende

Et dans ce second exemple, on utilisera fill:

ggplot(iris,aes(x=Sepal.Width, fill=Species))+
geom_density()+ 
labs(fill="Espèce") 
Modifier le titre de la légende

Assembler plusieurs graphiques

Il existe plusieurs solutions pour assembler plusieurs graphiques.
Une fonction simple à employer, est la fonction grid.arrange() du package gridExtra:

g1 <- ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
  geom_point()+ 
  labs(color="Espèce") 

g2 <- ggplot(iris,aes(x=Sepal.Width, fill=Species))+
  geom_density()+ labs(fill="Espèce") 
  
library(gridExtra) 
grid.arrange(g1,g2, ncol=2) 

Pour des assemblages plus sophistiqués, vous pouvez employer la fonction plot_grid du package cowplot, ou encore le package patchwork:

library(cowplot)
plot_grid(g1, g2, nrow=2, labels=c('A', 'B'),rel_heights = c(2, 4)) 
assemblage de graphiques avec le package cowplot
library(patchwork)
 
g1 + g2 +
    plot_layout(nrow=2, height=c(2,1)) 

Ajouter du texte

Pour ajouter une étiquette sur un point (par exemple un numéro d’identification), nous pouvons employer la fonction `geom_text()`, en définissant la variable concernée dans la fonction `aes()`.
Par exemple, si je créé, dans le jeu de données `iris`, une variable `id` avec le numéro de la ligne, je peux ensuite le faire figurer sur le graphique, comme ceci :

library(tidyverse) 

iris <- iris %>% 
  mutate(id=1:nrow(iris)

ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+ 
  geom_point()+ 
  geom_text(aes(label=id),size=3,check_overlap = TRUE, vjust=-1) 

Pour ajouter du texte sur le graphique, nous pouvons employer la fonction annotate(). Par exemple, si je délimite le graphique en 2 zones :

ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
    geom_point()+
    geom_vline(xintercept=3, col="magenta", size=2)+
    annotate("text", x=2.5,y=4,label= "ZONE1", color="magenta")+
    annotate("text", x=4,y=4,label= "ZONE2", color="magenta") 

Exportations

Une solution simple pour exporter un graphique, consiste à employer la fonction ggsave() du package ggplot2. Cette fonction permet alors de spécifier où le graphique doit être exporté, sous quel nom, quelle taille et avec quelle résolution(dpi).

Dans l’exemple ci dessous, je stock un graphique dans l’objet g3, puis je crée un dossier plot dans mon projet R, et enfin,  j’exporte le graphique g3, dans le dossier plot, sous le nom “mon_super_plot.jpg”, avec une dimension de 10 cm sur 10 cm et une résolution de 300 dpi.


# stockage du plot dans l'objet g3
g3 <- ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
    geom_point()+
    geom_vline(xintercept=3, col="magenta", size=2)+
    annotate("text", x=2.5,y=4,label= "ZONE1", color="magenta")+
    annotate("text", x=4,y=4,label= "ZONE2", color="magenta")

# creation du dossier plots
dir.create("plots")

# Exportation
ggsave(here::here("plots","mon_super_plot.jpg"), 
       g3, 
       width = 10, 
       height = 10, 
       units = "cm",
       dpi=300) 

Pour aller plus loin

  • Pour obtenir plus d’informations sur le package `cowplot`, vous pouvez consulter cette page.
  • Pour obtenir plus d’informations sur le package `patchwork`: vous pouvez consulter sa vignette.
  • Pour obtenir plus d’informations sur l’utilisation du package ggplot2, vous pouvez consulter le cookbook de Winston Chang.

J’espère que ce court post répondra à vos principaux besoins de mise en forme des graphiques. C’est à vous d’essayer, à présent !

Si cet article vous a plu ou vous a été utile, n’oubliez pas de le partager ! Vous pouvez également soutenir le blog par un don libre sur la page Tipeee.

Poursuivez votre lecture

8 réponses

  1. Bonjour Madame Vedova,

    Merci pour cet autre article très détaillé.
    J’ai énormément apprécié.

    Vivement un autre article.
    Excellente journée à vous.

  2. Bonjour Claire,
    Je vous remercie énormément pour cet article si bien élaboré. Vous fournissez un travail très honorable. J’attends avec joie le prochain article. Excellente journée.

  3. Bonjour Claire,
    merci pour l’article fort intéressant. Je voudrais savoir comment réaliser un graphique en courbes avec des barres d’erreur. Par exemple après une ANOVA avec mesures répétées, je souhaite comparer mes objets avec des courbes tout en montrant l’évaluation de la variable mesurée dans le temps.
    Merci

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Bonjour !

vous venez souvent ?

Identifiez-vous pour avoir accès à toutes les fontionnalités !

Aide mémoire off'R ;)

Enregistrez vous pour recevoir gratuitement mes fiches “aide mémoire” (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.