Introduction à la visualisation sous R avec le package ggplot2

ggplot2 c’est LE package qu’il faut savoir utiliser pour faire de la visualisation sous R ! Ses possibilités sont quasi illimitées, c’est ce qui permet de faire des visualisations vraiment intéressantes pour explorer les données en détail, ou pour les présenter.

Il faut un peu d’investissement pour comprendre le fonctionnement de ce package, et connaître les fonctions qui le composent, mais cela en vaut vraiment la peine !

Le but de cet article est d’initier au package ggplot2 celles et ceux qui ne l’utilisent pas encore. Vous y trouverez le principe de fonctionnement, les lignes de commandes pour réaliser les visualisations classiques, et enfin des pistes pour aller plus loin.

Installation du package ggplot2

Comme tout package, il faut commencer par l’importer. Pour cela il y a plusieurs solutions. Personnellement, j’utilise l’onglet package sous R Studio (dans la fenêtre en bas à droite), puis le sous onglet install :

package ggplot2
package ggplot2

Une fois que le package est installé, il faut le charger :

library(ggplot2) 

Une autre solution consiste à installer et à charger le package tidyverse, car ggplot2 est inclus dedans.

library(tidyverse)

    ## -- Attaching packages ---------------------------------------------------------------------------------- tidyverse 1.2.1 --

    ## v tibble  1.4.2     v purrr   0.2.5
    ## v tidyr   0.8.1     v dplyr   0.7.6
    ## v readr   1.1.1     v stringr 1.3.1
    ## v tibble  1.4.2     v forcats 0.3.0 

Principe de fonctionnement du package ggplot2

Le package ggplot2 fonctionne par couche successivesLa première d’entre elles, est un peu le canevas du graph. Elle consiste à indiquer, dans quel jeu de données se trouve les données, et quelles sont les variables que l’on souhaite représenter. Ensuite, une seconde couche est ajoutée, elle consiste, par exemple, à indiquer le type de graph que l’on souhaite réaliser : scatterplot, boxplot, barplot etc… Viennent ensuite les couches d’affinage en quelque sorte, qui vont permettre de choisir les couleurs, les échelles des axes, les options de légende etc…

Définition de la couche canevas

Pour définir ce que j’appelle la couche canevas, on utilise la fonction “ggplot()” et son argument “aes().”. Les graphs construits avec ggplot2 commencent toujours par ce type de ligne de code

ggplot(dataset, aes(x=, y = )) 

Par exemple :

ggplot(mtcars, aes(x=disp, y=mpg)) 
package ggplot2

Remarque : En plus de définir les variables qui seront utilisées dans le graph, la fonction aes() permet de réaliser un mappage. Cela signifie que ce qui est défini dans cette fonction est appliquée à toutes les couches qui composent le graph. Si c’est un peu obscure pour le moment, pas de panique ! J’y reviens plus en détail dans le paragraphe 7.

Définition du type de plot : geom_XXX

Il s’agit ensuite de définir le type de graph que l’on souhaite réaliser : un scatter plot, un boxplot, un barplot, etc… Pour cela, on rajoute un signe plus en bout de la première ligne (celle du canevas), et on ajoute une nouvelle ligne avec la fonction adéquate : geom_point() pour un scatter plot, geom_boxplot() pour un boxplot, geom_bar() pour un barplot etc…

ggplot(mtcars, aes(x=disp, y=mpg))+
geom_point() 
package ggplot2

A ce stade, vous vous demandez sans doute comment faire pour connaître toutes les fonctions geom_XXX disponibles.

Et bien c’est assez simple : elles sont décrites dans la partie “Geoms” de la cheatsheet du package ggplot. Vous pouvez la télécharger automatiquement en allant dans l’onglet Help –> Cheatsheets –> Data Visualization with ggplot2.

.

Définition des options du graph

Dans un troisième temps, on affine le graph, en précisant différentes couches concernant :

  • les échelles des axes : avec la fonctions scale_x_continuous(), par exemple
  • les couleurs : avec la fonction scale_colour_manual(), par exemple
  • les noms des axes, avec les fonctions xlab(), ylab(), par exemple
  • la légende avec, par exemple, avec la fonction theme(legend.position,=”bottom”)

Par exemple, pour passer l’axe des x dans l’échelle log, on ajoute la couche correspondante, grâce à la fonction coord_trans().

ggplot(mtcars, aes(x=disp, y=mpg))+ 
geom_point() + coord_trans(x="log10") 
package ggplot2

Comme précédemment, toutes ces fonctions sont décrites dans la cheat sheet. Cette feuille contient beaucoup d’infos, alors au début on a un peu de mal à s’y retrouver. Mais en la regardant de plus près, vous verrez que les informations sont classées par type de couches : les commandes de base, les geoms, les options de scaling, de themes etc…

Réaliser un scatterplot avec ggplot2

Le scatterplot de base

Imaginons que l’on souhaite réaliser un scatter plot avec le jeu de données iris, en représentant la variable Sepal.Length en y et la variable Sepal.Width en x :

 ggplot(iris, aes(x=Sepal.Width, y=Sepal.Length))+
        geom_point() 
visualisation avec R ggplot2

Définir des couleurs seln une variable

Le jeu de données comporte, en réalité, trois espèces d’iris différentes (variable Species). Pour représenter les points avec une couleur différente par espèce, on va définir l’argument colour dans la fonction aes() de la partie “canevas” :

ggplot(iris, aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
        geom_point() 
couleur ggplot2

Choisir d'autres couleurs

Pour choisir d’autres couleurs que celles appliquées par défaut, on utilise la fonction scale_colour_manual().

ggplot(iris, aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
        geom_point()+
        scale_colour_manual(values=c("magenta", "orange", "blue")) 
visualisation avec R ggplot2

Vous pouvez choisir facilement vos couleurs avec l’addin Colour Picker.

Utiliser des formes différentes de points

Pour cela, on utilise l’argument shape dans aes() :

  ggplot(iris, aes(x=Sepal.Width, y=Sepal.Length, colour=Species, shape=Species))+
        geom_point()+
        scale_colour_manual(values=c("magenta", "orange", "blue")) 
visualisation ggplot2

Choisir les formes de points

Pour cela, on utilise scale_shape_manual()

 ggplot(iris, aes(x=Sepal.Width, y=Sepal.Length, colour=Species, shape=Species))+
        geom_point()+
        scale_shape_manual(values=c(21,23,25)) 
visualisation avec R graph ggplot2

Vous pouvez retrouver les différents types de points dans la cheat sheet, au niveau de la section “shape and size scales”.

Gérer la taille des points

On peut représenter les points avec des tailles différentes, par exemple en fonction de la valeur d’une variable. Pour cela, on utilise l’argument size dans aes().

ggplot(iris, aes(x=Sepal.Width, y=Sepal.Length, colour=Species, size=Petal.Length))+
        geom_point() 
visualisation ggplot2

Ajouter une courbe ou droite de régression

Pour cela on utilise la fonction geom_smooth(). Par défaut, c’est une courbe de régression locale (LOESS ) si n < 1000. Sinon c’est une courbe de modèle additif généralisé qui est employée

ggplot(iris, aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
        geom_point()+
        scale_colour_manual(values=c("magenta", "orange", "blue"))+
        geom_smooth( colour="red") 
visualisation avec R ggplot2

Il est possible d’obtenir une droite de régression, en ajoutant l’argument method=”lm”.

ggplot(iris, aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
        geom_point()+
        scale_colour_manual(values=c("magenta", "orange", "blue"))+
        geom_smooth(method="lm", colour="red") 
visualisation avec R package ggplot2

Il est aussi possible d’obtenir une droite par espèce, en utilisant l’argument group dans la fonction aes() de la première ligne.

ggplot(iris, aes(x=Sepal.Width, y=Sepal.Length, colour=Species, group=Species))+
        geom_point()+
        scale_colour_manual(values=c("magenta", "orange", "blue"))+
        geom_smooth(method="lm", colour="red") 
droite de régression

Et pour que les droites aient la même couleur que les points auxquels elles se rattachent, il faut supprimer l’argument de couleur dans le geom_smooth. Comme cela, la couleur est “mappée” pour la couche geom_point() et geom_smooth(). Vous retrouverez plus de détails sur lemappage dans le paragraphe 7

ggplot(iris, aes(x=Sepal.Width, y=Sepal.Length, colour=Species, group=Species))+
        geom_point()+
        scale_colour_manual(values=c("magenta", "orange", "blue"))+
        geom_smooth(method="lm") 

Réaliser un boxplot avec ggplot2

Boxplot de base

Imaginons que l’on souhaite réaliser un boxplot de la variable Sepal.Length, par espèce. Pour cela, on utilise la fonction geom_boxplot().

    ggplot(iris, aes( y=Sepal.Length,x=Species))+
        geom_boxplot() 
boxplot avec ggplot2 et R

Pour utiliser des couleurs dans les boites, ici on utilise l’argument fill et non colour, dans la fonction aes(), car il s’agit de “remplir” les boites :

ggplot(iris, aes( y=Sepal.Length,x=Species, fill=Species)) +
geom_boxplot() 
boxplot ggplot2 R

Ajouter les observations

Pour ajouter les observations, on utilise la couche geom_jitter().

gplot(iris, aes( y=Sepal.Length,x=Species, fill=Species))+
        geom_boxplot()+
        geom_jitter() 
boxplot avec R et les points

Remarque : on peut diminuer l’étendue des points en largeur, avec l’argument width=0.25 dans le geom_jitter().

Donner une couleur aux observations

Pour ajouter des couleurs aux points, cette fois, on utilise l’argument colour dans aes(). On peut aussi réduire l’intensité de la couleur des boxplots en utilisant l’argument alpha.

ggplot(iris, aes( y=Sepal.Length,x=Species, fill=Species, colour=Species))+
        geom_boxplot(alpha=0.5)+
        geom_jitter(width=0.25) 
boxplot avec les points ggplot2

Réaliser des barplots avec ggplot2

Il existe deux types de barplot réalisables avec ggplot 2. Les premiers, que j’appelle “barplot de comptage“, permettent de représenter un nombre de données dans chaque modalité d’une variable.

La seconde catégorie consiste a représenter un paramètre statistique comme une moyenne. Personnellement je suis complètement opposée ce type de graph, car ils ne permettent pas de visualiser le nombre de données, ni leur répartition, ni de la présence éventuelle d’outliers ! Dans cette situation il est préférable de faire un boxplot (surtout qu’il est possible d’y faire figurer la moyenne en plus de la médiane).

Dans tous les cas, on utilise la fonction geom_bar().

Barplot de comptage

En utilisant le jeu de données “mtcars”, imaginons, par exemple, que je veuille représenter le nombre de voitures ayant 3,4 ou 5 vitesses (variables gear) :

# pas de y car c'est un comptage
    ggplot(mtcars,aes(x=as.factor(gear)))+
        geom_bar() 
barplot avec R

Remarque :J’utilise ici factor(gear) car cette variable est considérée comme une variable numérique

Pour ajouter des couleurs aux barres, comme précédemment, j’utilise l’argument fill et j’indique quelle variable doit être considérée :

ggplot(mtcars,aes(as.factor(gear), fill=as.factor(gear)))+
        geom_bar() 
ggplot2 R visualisation

Pour représenter le nombre de données par vitesse, en fonction d’une autre variable (ici le nombre de carburateurs), il suffit de l’indiquer dans l’argument fill :

 # en prenant en compte deux variables catégorielles (ici carb et gear)

    ggplot(mtcars,aes(as.factor(gear), fill=as.factor(carb)))+
        geom_bar() 
barplot avec ggplot2

On peut encore ramener la somme des comptages à 1, autrement dit de représenter les comptages sous la forme de pourcentages. Pour cela, on utilise l’argument position=”fill” :

  ggplot(mtcars,aes(as.factor(gear)))+
        geom_bar(aes(fill=as.factor(carb)),position = "fill") 
ggplot2 R

Il est également possible de représenter ces données avec un autre positionnement, en utilisant l’option dodge.

 ggplot(mtcars,aes(as.factor(gear), fill=as.factor(carb)))+
        geom_bar(position = "dodge") 
barplot avec R ggplot2 visualisation

Pour changer les couleurs on utilise la couche scale_fill_manual() et non plus scale_colour_manual() car ce sont des zones entières qui sont concernées.

ggplot(mtcars,aes(as.factor(gear)))+
        geom_bar(aes(fill=as.factor(carb)),position = "dodge")+
        scale_fill_manual(values=c("red","yellow","blue","magenta", "orange", "white")) 
visualisation avec R

Barplot en représentant un parametre statistique

Par exemple, ici je vais représenter les moyennes de la variable mpg (miles per gallon) pour tous les croisements des modalités des variables gear (nombre de vitesses) et carb (nombre de carburateurs). Pour cela, il est nécessaire de fournir à la fonction ggplot, un jeu de données comportant ces moyennes. Une façon très simple de les obtenir est d’utiliser la fonction summarySE() du package Rmisc.

library(Rmisc)
mpg.ag2<-summarySE(mtcars,measurevar="mpg", groupvars=c("gear","carb"))

mpg.ag2

    ##    gear carb N      mpg       sd        se        ci
    ## 1     3    1 3 20.33333 1.934770 1.1170397  4.806234
    ## 2     3    2 4 17.15000 2.092048 1.0460242  3.328916
    ## 3     3    3 3 16.30000 1.053565 0.6082763  2.617201
    ## 4     3    4 5 12.62000 2.089737 0.9345587  2.594751
    ## 5     4    1 4 29.10000 5.061620 2.5308101  8.054167
    ## 6     4    2 4 24.75000 3.961060 1.9805302  6.302931
    ## 7     4    4 4 19.75000 1.552417 0.7762087  2.470243
    ## 8     5    2 2 28.20000 3.111270 2.2000000 27.953650
    ## 9     5    4 1 15.80000       NA        NA        NA
    ## 10    5    6 1 19.70000       NA        NA        NA
    ## 11    5    8 1 15.00000       NA        NA        NA 

Certaines combinaisons, par exemple 5 vitesses et 8 carburateurs ne sont pas présent dans le jeu de données, c’est pour cela que la table générée comporte des NA.

La représentation des moyennes plutôt que le nombre de données est possible en employant l’argument stat=”identity” dans la fonction geom_bar().

ggplot(mpg.ag2,aes(x=gear, y=mpg, fill=as.factor(carb)))+
        geom_bar(position=position_dodge(), stat="identity")+
        ylab("moyenne mpg") 
barplot visualisation ggplot2 package

Il est ensuite facile d’ajouter les intervalles de confiance des moyennes avec la fonction geom_errorbar, comme ceci :

ggplot(mpg.ag2,aes(x=gear, y=mpg, fill=as.factor(carb)))+
        geom_bar(position=position_dodge(), stat="identity")+
        geom_errorbar(aes(ymin=mpg-ci, ymax=mpg+ci),
                      width=.2,                    # Width of the error bars
                      position=position_dodge(.9)) 
intervalle de confiance

Vous trouverez plus d’options sur cette page

Le facetting

C’est une des grandes possibilités de ggplot2. Ca consiste à sous diviser un graph, selon les modalités d’une ou plusieurs variables.

Ici par exemple, je vais utiliser le jeu de données Melanoma du package MASS, et je vais étudier les relations entre la variable thickness et time, pour chacune des modalités de la variable status :

library(MASS)

    ## 
    ## Attaching package: 'MASS'

    ## The following object is masked from 'package:dplyr':
    ## 
    ##     select

    head(Melanoma)

    ##   time status sex age year thickness ulcer
    ## 1   10      3   1  76 1972      6.76     1
    ## 2   30      3   1  56 1968      0.65     0
    ## 3   35      2   1  41 1977      1.34     0
    ## 4   99      3   0  71 1968      2.90     0
    ## 5  185      1   1  52 1965     12.08     1
    ## 6  204      1   1  28 1971      4.84     1
  ggplot(Melanoma, aes(y=thickness, x=time))+
        geom_point()+
        geom_smooth()+
        facet_wrap(~status) 
facet

La division peut également être faite en fonction de deux variables :.

ggplot(Melanoma, aes(y=thickness, x=time))+
        geom_point()+
        geom_smooth()+
        facet_grid(sex~status) 
facet

Le facetting se réalise à l’aide des fonctions facet_grid() et facet_wrap().

Retour sur la notion de mapping avec la fonction aes

Ici par exemple, j’utilise l’argument colour = Species dans la fonction aes(). Cela à pour conséquence de donner une couleur au points et aux contours des boites en fonction des modalités de la variable Species. On dit alors qu’il y a un mapping: la manière dont la couleur des boites et des points est en quelque sorte exporter pour toutes les couches.

ggplot(iris, aes( y=Sepal.Length,x=Species, colour=Species))+
        geom_boxplot(alpha=0.5)+
        geom_jitter(width=0.25) 
visualisation ggplot2

Si en revanche, je souhaite fixer la couleur pour une couche donnée, et bien, je dois l’indiquer dans l’argument colour de la couche considérée. Ici par exemple, je décide d’utiliser une seule et unique couleur magenta pour tous les points. J’utilise donc l’argument colour dans la couche geom_jitter :

ggplot(iris, aes( y=Sepal.Length,x=Species, colour=Species))+
        geom_boxplot(alpha=0.5)+
        geom_jitter(width=0.25, colour="magenta") 
ggplot 2

Deux ou trois petites choses en plus

Les thèmes

Il existe également des thèmes de graphs :

ggplot(iris, aes( y=Sepal.Length,x=Species, colour=Species))+
        geom_boxplot(alpha=0.5)+
        geom_jitter(width=0.25)+
        theme_classic() 
ggplot2 R visualisation
library(ggthemes) 
ggplot(mtcars) +
  geom_point(aes(x = wt, y = mpg, colour = factor(gear))) +
  facet_wrap(~am)+ theme_excel() +
  scale_colour_excel() 

Il existe même un thème pour les nostalgiques d’Excel ! C’est juste pour rire, on est bien d’accord ?

library(ggthemes)
ggplot(mtcars) +
       geom_point(aes(x = wt, y = mpg, colour = factor(gear))) +
       facet_wrap(~am)+
       theme_excel() +
       scale_colour_excel() 
ggplot2 thème

Les axes, titres et légende

Vous pouvez donner un titre à votre graph avec la fonction ggtitle(), puis renommer les axes avec ylab() et xlab(). La position de la légende se gère avec theme(legend.position=” “).

 ggplot(iris, aes( y=Sepal.Length,x=Species, fill=Species, colour=Species))+
        geom_boxplot(alpha=0.5)+
        geom_jitter(width=0.25)+
        ggtitle("Mon super premier boxplot")+
        ylab("Longueur des sépales")+
        xlab("Espèces")+
        theme(legend.position="bottom") 
titre ggplot2

Comment trouver de l'aide et progresser ?

Les ressources francophones sur le package ggplot2 sont rares. Néanmoins, vous trouverez beaucoup d’infos et d’exemples :

  • Dans le chapitre 8 de l’introduction au tidyverse, de Julien Barnier.
  • Utiliser la cheat sheet : elle contient beaucoup d’infos !
  • Utiliser l’aide sur les fonctions : par exemple ?geom_text()
  • Si vous cherchez un livre, je vous conseille de R Graphics Cookbook de Winston Chang : vous pouvez le consulter gratuitement en cliquant ici, ou vous procurer une copie reliée en cliquant sur l’image ci-dessous (lien affilié).
  • Ecrire votre question en anglais dans google / stackoverflow

J’espère que cette introduction au package ggplot2 vous aura convaincu de son utilité, et vous aura permis de faire vos premières visualisations.

Si cet article vous a plu, ou vous a été utile, et si vous le souhaitez, vous pouvez soutenir ce blog en faisant un don sur sa page Tipeee 🙏

 

Retrouvez ici d’autres articles en lien avec le package ggplot2:

 

 

Note : Je touche une petite commission (entre 3 et 6%) si vous passez par les liens Amazon de cet article pour acheter les livres mentionnés. cela m’aide à entretenir ce blog, merci si vous le faites ! 😉

21 réponses

  1. Bonjour,
    je voudrai dire que j’ai utilisé le package ggplot 2 pour faire la visualisation de mes données dans un séminaire internationale à Alger (1-3 octobre2018). grâce à vous j’ai pu attirer l’attention de plusieurs participants vers cette visualisation et j’ai essayé de les orienter vers votre blog.
    merc infiniment

  2. “La seconde catégorie consiste a représenter un paramètre statistique comme une moyenne. Personnellement je suis complètement opposée ce type de graph, car ils ne permettent pas de visualiser le nombre de données, ni leur répartition, ni de la présence éventuelle d’outliers ! Dans cette situation il est préférable de faire un boxplot (surtout qu’il est possible d’y faire figurer la moyenne en plus de la médiane).”
    Bonjour et merci pour votre travail, ce tutoriel est vraiment facile et donne rapidement un accès à l’utilisation de ggplot.
    Lorsque vous parlez de l’utilisation des histogrammes pour représenter une moyenne, je partage cet avis. Quelle solution proposez-vous lorsque l’on doit représenter une moyenne calculée à partir d’un triplicat ? Car dans cette configuration le boxplot n’a pas de réel sens ?
    Merci encore.

  3. Bonjour,
    Superbe prise en main abondamment illustrée. Merci.

    Note: Je crois que vous vouliez écrire «scale_x_continuous» au lieu de «scale_x_numeric» pour la modification des échelles.

    1. Bonjour Cécile,

      il faut ajouter la ligne
      theme(plot.title = element_text(hjust = 0.5))

      Voici un exemple :
      data(iris)
      ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width))
      geom_point()
      ggtitle(“mon titre”)
      theme(plot.title = element_text(hjust = 0.5))

      Bonne continuation

  4. Bonjour je suis novice en statistique avec R.

    je travail sur l’évolution journalière des concentrations de micro algues, je sollicite de votre savoir faire pour m’aider à présenter des graphiques de l’évolution de la concentration en fonction de l’age des cultures en jours. je travail sur des triplicatas pour chaque cas. donc je veux présenter les moyennes avec les écarts types.

    je vous remercie pour ce bloc

  5. Merci beaucoup pour cette introduction j’espère que désormais je vais utiliser ggplot2 pour la visualisation des données grâce à vous merci infiniment

  6. ggplot est certainement très puissant, mais avant d’arriver à ses fins il faut patauger pendant des heures car très très complexe, dommage

  7. J’ai toujours recourus à vos publications pour me perfectionner dans l’utilisation du logiciel R. Pour ça, merci beaucoup.
    Je voulais vous demandez, si possible, d’écrire un article sur la préparation du jeu des données et la réalisation de la régression logistique conditionnelle. Comment avoir, dans un jeu des données réel, l’objet à mettre dans la fonction stratum ?

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.