Restart 5: Introduction aux graphiques avec ggplot2

Lise Vaudor

21/09/2021

Introduction

ggplot2 est un package utilisé pour réaliser des graphiques selon des principes qui lui sont propres.

(en l’occurrence, ces principes sont inspirés du livre “The Grammar of Graphics” de Leland Wilkinson, d’où le gg de ggplot).

ggplot2 se distingue des autres outils de production graphique sous R, et notamment des fonctions graphiques “de base” comme “hist”, “boxplot”, etc. par son principe général qui est de décrire et donc produire un graphique comme un assemblage de couches

=> production simple et intuitive de graphiques beaux et riches

illustration Allison Horst

Introduction

Commençons par charger le package ggplot2 -après l’avoir, si nécessaire, installé- :

library(ggplot2)

Jeu de données illustratif

Pour vous illustrer les principes et résultats graphiques du package ggplot2, je vais réutiliser le jeu de données catdata:

catdata <- read.csv("../../datasets/catdata.csv", sep=";")
head(catdata)
  haircolor hairpattern    sex weight age foodtype
1       red       solid female    4.6  12    other
2     black       tabby female    5.5   6      dry
3     white       tabby female    5.6   8      wet
4       red       tabby female    6.1   5      dry
5     brown       solid female    5.3   7      dry
6     black       tabby   male    6.9   5      wet

Les bases: jeu de données, aethetics, et geoms

On crée un graphique à l’aide de la fonction ggplot. On spécifie sur quel jeu de données le graphique va être construit, ainsi que les aesthetics x et y:

p <- ggplot(data=catdata,
            mapping=aes(x=haircolor,y=weight))
plot(p)

On peut simplifier l’écriture de cette commande en omettant de préciser les noms des arguments data et mapping, et afficher directement le graphique (sans lui assigner un nom, ici p):

ggplot(catdata,
       aes(x=haircolor,y=weight))

Geom

On peut par exemple de représenter l’information à l’aide d’un geom “point”:

ggplot(catdata,aes(x=haircolor,y=weight)) +
  geom_point()

Si je souhaite réaliser un graphique de type boxplot plutôt que point alors il faudra que je modifie la fonction geom() que j’utilise…

Remarque

Vous devez choisir un type de geom compatible avec la nature des informations (en x et y) que vous voulez représenter!

ggplot(catdata,aes(x=haircolor)) +
  geom_point()
Error in `geom_point()`:
! Problem while setting up geom.
ℹ Error occurred in the 1st layer.
Caused by error in `compute_geom_1()`:
! `geom_point()` requires the following missing
  aesthetics: y

Types de geom

Graphique univarié, x discrète

ggplot(catdata,aes(x=haircolor)) +
  geom_bar()

Graphique univarié, x continue

ggplot(catdata,aes(x=weight)) +
  geom_histogram()

Modification du type de geom

Bivarié, x et y continues

ggplot(catdata,aes(x=age, y=weight)) +
  geom_point()

Bivarié, x et y continues

ggplot(catdata,aes(x=age, y=weight)) +
  geom_bin2d()

Modification du type de geom

Bivarié, x discrète et y continue

ggplot(catdata,aes(x=haircolor, y=weight)) +
  geom_boxplot()

Bivarié, x discrète et y continue

ggplot(catdata,aes(x=haircolor, y=weight)) +
  geom_violin()

Superposition de geoms

ggplot(catdata, aes(x=haircolor, y=age))+
  geom_point(col="blue", size=2) +
  geom_jitter(col="pink", size=2)

Paramétrisation du geom

Evidemment tous les geoms peuvent être paramétrés. Je peux par exemple modifier la couleur de mes boîtes à moustache de la façon suivante:

ggplot(catdata,aes(x=haircolor,y=weight)) +
  geom_boxplot(fill="lightskyblue")

Parmi les arguments les plus utilisés pour paramétrer les geoms, on peut citer:

  • color: la couleur des lignes
  • fill: la couleur de remplissage
  • linetype: le type de ligne
  • size: la taille des symboles ou l’épaisseur des lignes
  • alpha: la transparence

Paramétrisation du geom

ggplot(catdata, aes(x=age, y= weight)) +
  geom_point(shape=24,
             color="blue",
             fill="lightskyblue",
             alpha=0.6,
             size=3)

ggplot(catdata, aes(x=age)) +
  geom_density(color="red",
               fill="pink",
               linetype=3,
               lwd=2)

On récapitule!

On a parlé de quoi, déjà?

  • principes du package ggplot2, construction d’un graphique par “couches”
  • représentation de l’information par des geoms
  • exploration de divers geoms (geom_point, geom_boxplot, geom_violin, geom_density, geom_bar, geom_histogram, geom_jitter, geom_bin2d, etc.)
  • paramétrisation des geoms (color, fill, shape, alpha, size, lwd, linetype etc.)

Relier paramètres graphiques et variables: mapping

Nous avons vu comment définir les paramètres des geoms de manière “absolue”. Par exemple:

ggplot(catdata,
       mapping=aes(x=haircolor, y=weight)) +
  geom_boxplot(fill="lightskyblue")

Je peux aussi lier un paramètre graphique à une variable. On appelle ce procédé mapping.

Cette variable fait alors partie des aesthetics.

ggplot(catdata,
       mapping=aes(x=haircolor,y=weight)) + 
  geom_boxplot(mapping=aes(fill=haircolor))

Relier paramètres graphiques et variables: mapping

On peut utiliser en aesthetic des variables autres que celles qui définissent x et y… Cela veut dire que l’on peut très simplement rajouter des couches d’information (et les légendes correspondantes!) au graphique.

ggplot(catdata,aes(x=haircolor,y=weight)) + 
  geom_boxplot(aes(fill=sex))

Esthétique propre à un geom vs esthétique propre à un graphique

Remarquez que l’esthétique fill=sex peut être spécifiée à la fois dans l’appel à geom_boxplot() et l’appel à ggplot() elle-même

ggplot(catdata,aes(x=haircolor,y=weight)) + 
  geom_boxplot(aes(fill=sex))

ggplot(catdata,aes(x=haircolor,y=weight, fill=sex)) + 
  geom_boxplot()

Esthétique propre à geom vs esthétique propre à graphique

Cependant l’endroit où l’esthétique est spécifiée peut avoir un effet quand le graphique comprend plusieurs couches:

ggplot(catdata,aes(x=haircolor,y=weight)) + 
  geom_boxplot(aes(fill=sex))+
  geom_point(shape=24,size=2)

ggplot(catdata,aes(x=haircolor,y=weight, fill=sex)) + 
  geom_boxplot() +
  geom_point(shape=24,size=2)

Facettes (en lignes)

ggplot(catdata, aes(x=foodtype, y=age)) +
  geom_boxplot(aes(fill=foodtype)) + 
  facet_grid(rows=vars(hairpattern))

Facettes (en colonnes)

p <- ggplot(catdata, aes(x=foodtype, y=age)) +
  geom_boxplot(aes(fill=foodtype))  
pf=p+facet_grid(cols=vars(haircolor))
plot(pf)

Facettes (en grille)

p <- ggplot(catdata, aes(x=foodtype, y=age)) +
  geom_boxplot(aes(fill=foodtype))  
pf=p+facet_grid(rows=vars(hairpattern),
                cols=vars(haircolor))
plot(pf)

Facettes (libres)

p <- ggplot(catdata, aes(x=foodtype, y=age)) +
  geom_boxplot(aes(fill=foodtype))  
pf=p+facet_wrap(vars(hairpattern))
plot(pf)

Titres des axes

ggplot2 offre également des outils pour travailler facilement sur les problèmes de titres, d’échelles et d’axes.

ggplot(catdata, aes(x=foodtype, y=age)) +
  geom_boxplot(aes(fill=foodtype)) + 
  labs(x="type de nourriture",
       y="âge")

Echelles des axes

Un des aspects les plus intéressants de ggplot2 est la facilité avec laquelle on peut transformer les variables de position x et y.

sans transformation d’échelle

p <-ggplot(catdata, aes(x=foodtype, y=age)) +
  geom_boxplot(aes(fill=foodtype)) + 
  labs(x="type de nourriture",y="âge")
plot(p)

avec transformation d’échelle

p_log <- p +
  scale_y_log10(breaks=seq(2,17,by=2))
plot(p_log)

Limites des axes

On peut également définir des limites d’axes

sans limites d’axes

p <- ggplot(catdata, aes(x=foodtype, y=age)) +
  geom_boxplot(aes(fill=foodtype)) + 
  labs(x="type de nourriture",
       y="âge")
plot(p)

avec limites d’axes

On peut également définir des limites d’axes

p_lims <- p + 
  scale_y_continuous(limits=c(0,20))
plot(p_lims)

Etiquettes des axes

Ou définir les endroits où les barres s’affichent sur l’axe (argument breaks), ainsi que les étiquettes associées (argument labels).

ggplot(catdata, aes(x=foodtype, y=age)) +
  geom_boxplot(aes(fill=foodtype)) + 
  labs(x="type de nourriture",
       y="âge") +
  scale_y_continuous(limits=c(0,20),
                     breaks=c(0,5,10,15),
                     labels=c("bébé","jeune","moyen","âgé")) +
  scale_x_discrete(labels=c("dry"="croquettes",
                            "wet"="pâtée",
                            "other"="autre"))

Echelles colorées

p <-ggplot(catdata, aes(x=haircolor, y=weight, fill=haircolor))+
  geom_boxplot()+
  scale_fill_manual(values=c("black","brown","orange","white"))
plot(p)

p <-ggplot(catdata, aes(x=age, y=weight, color=haircolor))+
  geom_point(size=2)+
  scale_color_manual(values=c("black","brown","orange","white"))
plot(p)

Echelles colorées

p <-ggplot(catdata, aes(x=hairpattern))+
  geom_bar(aes(fill=hairpattern))+
  scale_fill_brewer(palette="Purples")
plot(p)

p <-ggplot(catdata, aes(x=age, y=weight))+
  geom_bin2d(binwidth=1)+
  scale_fill_gradient(low="yellow",high="green")
plot(p)

Thèmes

Les thèmes permettent de définir l’allure globale du graphique. On peut modifier le thème de la manière suivante :

classic

p <- ggplot(catdata, aes(x=age, y=weight, color=haircolor)) +
  geom_point() +
  theme_classic()
plot(p)

black & white

p <- ggplot(catdata, aes(x=age, y=weight, color=haircolor)) +
  geom_point() +
  theme_bw()
plot(p)

Thèmes

Les thèmes permettent de définir l’allure globale du graphique. On peut modifier le thème de la manière suivante :

minimal

p <- ggplot(catdata, aes(x=age, y=weight, color=haircolor)) +
  geom_point() +
  theme_minimal()
plot(p)

grey

p <- ggplot(catdata, aes(x=age, y=weight, color=haircolor)) +
  geom_point() +
  theme_grey()
plot(p)

Statistiques descriptives

Le package ggplot2 permet en outre de rajouter des informations provenant de jeux de données supplémentaires.

Cela permet par exemple de calculer des statistiques descriptives qui résument l’information par groupe. On peut évidemment passer par les fonctions de dplyr pour calculer ces statistiques!!

Par exemple, on peut rajouter un geom de type point qui nous informe sur les moyennes par groupes -définis pour la variable x, c’est à dire haircolor-.

library(dplyr)
catdata_grouped1 <- catdata %>%
  group_by(haircolor) %>%
  summarise(meanweight=mean(weight),
            .groups="drop")

p <- ggplot(catdata,aes(x=haircolor,y=weight)) + 
  geom_boxplot(aes(fill=sex)) +
  geom_point(data=catdata_grouped1, aes(y=meanweight))
plot(p)

Statistiques descriptives

On peut calculer une statistique en groupant les données selon plusieurs variables. Ici par exemple on combien les groupes données par la variable haircolor et par la variable sex:

catdata_grouped2 <- catdata %>%
  group_by(haircolor,sex) %>%
  summarise(meanweight=mean(weight),
            .groups="drop")

p <- ggplot(catdata,aes(x=haircolor,y=weight)) + 
  geom_boxplot(aes(fill=sex)) +
  geom_point(data=catdata_grouped2,
             aes(y=meanweight, group=sex),
             position=position_dodge(width=0.75))
plot(p)

Modèle de régression

Le package ggplot2 offre aussi des possibilités intéressantes pour travailler sur le lien entre deux variables quantitatives (modèles de régression):

p <- ggplot(catdata, aes(x=age,y=weight)) +
  geom_point(aes(col=sex)) +
  geom_smooth()
plot(p)
`geom_smooth()` using method = 'loess' and formula = 'y ~
x'

On ajoute une droite de régression avec la fonction geom_smooth (ici par défaut, régression de type loess). Allez voir le fichier d’aide associé à la fonction geom_smooth pour voir l’ensemble des paramètres de cette fonction…

Plus d’explications sur la régression loess ici

Modèle de régression

On peut préciser le modèle en précisant des aesthetics supplémentaires:

p <- ggplot(catdata, aes(x=age,y=weight,col=sex)) +
  geom_point() +
  geom_smooth()
plot(p)
`geom_smooth()` using method = 'loess' and formula = 'y ~
x'

Modèle de régression linéaire

Le type de régression réalisé est également paramétrable. Ici, par exemple, on réalise une régression linéaire:

p <- ggplot(catdata,
            aes(x=age,y=weight)) +
  geom_point(aes(col=sex))+
  geom_smooth(aes(group=sex),
              method="lm")
plot(p)
`geom_smooth()` using formula = 'y ~ x'

ggplot2 permet de produire la représentation graphique du modèle de régression. Pour effectuer une régression et (par exemple récupérer ses coefficients), on passe par lm():

reg=lm(weight~age*sex, data=catdata)
summary(reg)

Call:
lm(formula = weight ~ age * sex, data = catdata)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.62661 -0.72661  0.02871  0.62871  2.52863 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  5.11809    0.28486  17.967   <2e-16 ***
age         -0.06383    0.04007  -1.593   0.1133    
sexmale     -0.36767    0.42297  -0.869   0.3861    
age:sexmale  0.11906    0.06415   1.856   0.0654 .  
---
Signif. codes:  
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.025 on 149 degrees of freedom
Multiple R-squared:  0.0546,    Adjusted R-squared:  0.03556 
F-statistic: 2.868 on 3 and 149 DF,  p-value: 0.03854

On récapitule!

On a parlé de quoi, déjà?

  • titres du graphique, et des axes
  • échelles, limites et étiquettes des axes
  • échelles colorées
  • thèmes
  • modèles stats