library(ggplot2)
Représentations graphiques
Introduction
Introduction
ggplot2
est une librairie qui permet de générer des graphiques avec une syntaxe cohérente et puissante. Elle nécessite l’apprentissage d’un “mini-langage” supplémentaire, mais permet la construction de graphiques complexes de manière efficace.
Une des particularités de ggplot2
est qu’elle part du principe que les données relatives à un graphique sont stockées dans un tableau de données (data.frame
, tibble
ou autre).
Ce chapitre est élaboré à partir du chapitre 8 de Barnier et Kauffmann (2023).
Préparation
ggplot2
est un paquet comme un autre, que l’on charge à l’aide de library
Données
Les données que nous allons utiliser sont issues du recensement de la population de 2018 inclus dans le paquet questionr
, que nous devons installer et charger.
install.packages('questionr')
library(questionr)
Nous allons seulement utiliser une partie de ces données, nous utilisons pour cela la fonction filter
de la librairie tidyverse
.
data(rp2018)
<- filter(
rp
rp2018,%in% c("Oise", "Rhône", "Hauts-de-Seine", "Lozère", "Bouches-du-Rhône")
departement )
Initialisation : données à représenter
Un graphique ggplot2
s’initialise à l’aide de la fonction ggplot()
. Les données sont toujours issues d’un tableau de données, qu’on passe en argument data à la fonction ggplot
.
ggplot(data = rp)
ggplot(rp) ## Equivalent au premier et généralement utilisé
Géométries : comment ?
Il faut ajouter des éléments de représentation graphique. Ces éléments sont appelés des geom
et on les ajoute à l’objet graphique de base avec l’opérateur +
.
Une des geom
les plus simples est geom_histogram
:
ggplot(rp) + geom_histogram()
Esthétiques : quelles données sont représentées ?
Reste à indiquer quelle donnée nous voulons représenter sous forme d’histogramme. Cela se fait à l’aide d’arguments passés via la fonction aes()
. Ici, nous avons un paramètre à renseigner, x
, qui indique la variable à représenter sur l’axe des x (l’axe horizontal).
Ainsi, si on souhaite représenter la distribution des communes du jeu de données selon le pourcentage de cadres dans leur population active (variable cadres
) :
ggplot(rp) + geom_histogram(aes(x = cadres))
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Si on veut représenter une autre variable, il suffit de changer la valeur de x
:
ggplot(rp) + geom_histogram(aes(x = ouvr))
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
En résumé
Pour représenter un graphique, il faut :
- Des données (argument
data
deggplot()
) - Un type de représentation (histogramme, ligne, point, etc) donné par
geom_xxxx
oùxxxx
est le type de représentation recherché. - Une ou des variables à représenter (argument
aes()
dansgeom_xxxx
)
On lie les différentes commandes à l’aide de l’opérateur +
.
Les géométries
Nuage de points
Certaines geom
prennent plusieurs paramètres. Ainsi, si on veut représenter un nuage de points, on peut le faire en ajoutant un geom_point
. On doit alors indiquer à la fois la position en x
(la variable sur l’axe horizontal) et en y
(la variable sur l’axe vertical) de ces points, il faut donc passer ces deux arguments à aes()
:
ggplot(rp) + geom_point(aes(x = dipl_sup, y = cadres))
Apparence des géométries
On peut modifier certains attributs graphiques d’un geom
en lui passant des arguments supplémentaires. Par exemple, pour un nuage de points, on peut modifier :
- la couleur avec l’argument
color
; - la taille avec l’argument
size
; - la transparence avec l’argument
alpha
.
ggplot(rp) +
geom_point(
aes(x = dipl_sup, y = cadres),
color = "darkgreen", size = 3, alpha = 0.3
)
On notera que dans ce cas les arguments sont dans la fonction geom
mais à l’extérieur du aes()
. Plus d’explications sur ce point dans quelques instants.
Exemples de geom
Il existe un grand nombre de geom
, décrites en détail dans la documentation officielle. Outre les geom_histogram
et geom_point
que l’on vient de voir, on pourra noter les geom
suivantes :
geom_boxplot
geom_violin
geom_bar
etgeom_col
geom_text
geom_label
geom_density
geom_line
geom_hex
etgeom_bin2d
Mappages
Un mappage, dans ggplot2
, est une mise en relation entre un attribut graphique du geom
(position, couleur, taille…) et une variable du tableau de données.
Ces mappages sont passés aux différents geom
via la fonction aes()
.
Exemples de mappages
On a déjà vu les mappages x
et y
pour un nuage de points. Ceux-ci signifient que la position d’un point donné horizontalement (x
) et verticalement (y
) dépend de la valeur des variables passées comme arguments x
et y
dans aes()
.
ggplot(rp) +
geom_point(
aes(x = dipl_sup, y = cadres)
)
Couleur (color
ou colour
)
Il y en a d’autres. color
permet de faire varier la couleur des points automatiquement en fonction des valeurs d’une troisième variable.
ggplot(rp) +
geom_point(
aes(x = dipl_sup, y = cadres, color = departement)
)
Tailles (size
)
On peut aussi faire varier la taille des points avec size
. Ici, la taille dépend de la population totale de la commune :
ggplot(rp) +
geom_point(
aes(x = dipl_sup, y = cadres, color = departement, size = pop_tot)
)
Transparence (alpha
)
On peut même associer la transparence des points à une variable avec alpha
:
ggplot(rp) +
geom_point(
aes(x = dipl_sup, y = cadres, color = departement, size = pop_tot, alpha = maison)
)
Chaque geom
possède sa propre liste de mappages.
aes()
or not aes()
?
Parfois on souhaite changer un attribut sans le relier à une variable : par exemple si on veut représenter tous les points en rouge. On utilise toujours l’attribut color
, mais comme il ne s’agit pas d’un mappage, on le définit à l’extérieur de la fonction aes()
.
ggplot(rp) +
geom_point(
aes(x = dipl_sup, y = cadres),
color = "red"
)
Par contre, si on veut faire varier la couleur en fonction des valeurs prises par une variable, on réalise un mappage, et on doit donc placer l’attribut color
à l’intérieur de aes()
.
ggplot(rp) +
geom_point(
aes(x = dipl_sup, y = cadres, color = departement)
)
On peut mélanger attributs liés à une variable (mappage, donc dans aes()
) et attributs constants (donc à l’extérieur). Dans l’exemple suivant, la taille varie en fonction de la variable pop_tot
, mais la couleur est constante pour tous les points.
ggplot(rp) +
geom_point(
aes(x = dipl_sup, y = cadres, size = pop_tot),
color = "royalblue"
)
La règle est donc simple mais très importante :
Si on établit un lien entre les valeurs d’une variable et un attribut graphique, on définit un mappage, et on le déclare dans aes()
. Sinon, on modifie l’attribut de la même manière pour tous les points, et on le définit en-dehors de la fonction aes()
.
Représentation de plusieurs geom
On peut représenter plusieurs geom
simultanément sur un même graphique, il suffit de les ajouter à tour de rôle avec l’opérateur +
.
Par exemple, on peut superposer la position des points au-dessus d’un boxplot. On va pour cela ajouter un geom_point
après avoir ajouté notre geom_boxplot
.
ggplot(rp) +
geom_boxplot(aes(x = departement, y = maison)) +
geom_point(
aes(x = departement, y = maison),
col = "red", alpha = 0.2
)
Quand une commande ggplot2
devient longue, il peut être plus lisible de la répartir sur plusieurs lignes. Dans ce cas, il faut penser à placer l’opérateur +
en fin de ligne, afin que R comprenne que la commande n’est pas complète et qu’il prenne en compte la suite.
Pour simplifier un peu le code, plutôt que de déclarer les mappages dans chaque geom
, on peut les déclarer dans l’appel à ggplot()
. Ils seront automatiquement “hérités” par les geom
ajoutés (sauf s’ils redéfinissent les mêmes mappages).
ggplot(rp, aes(x = departement, y = maison)) +
geom_boxplot() +
geom_jitter(color = "red", alpha = 0.2)
Autre exemple, on peut vouloir ajouter à un nuage de points une ligne de régression linéaire à l’aide de geom_smooth
:
ggplot(rp, aes(x = dipl_sup, y = cadres)) +
geom_point(alpha = 0.2) +
geom_smooth(method = "lm")
`geom_smooth()` using formula = 'y ~ x'
Et on peut même superposer une troisième visualisation de la répartition des points dans l’espace avec geom_density2d
:
ggplot(rp, aes(x = dipl_sup, y = cadres)) +
geom_point(alpha = 0.2) +
geom_density2d(color = "red") +
geom_smooth(method = "lm")
`geom_smooth()` using formula = 'y ~ x'
Scales
On a vu qu’avec ggplot2
on définit des mappages entre des attributs graphiques (position, taille, couleur, etc.) et des variables d’un tableau de données. Ces mappages sont définis, pour chaque geom
, via la fonction aes()
.
Les scales dans ggplot2
permettent de modifier la manière dont un attribut graphique sera relié aux valeurs d’une variable, et dont la légende correspondante va être affichée. Par exemple, pour l’attribut color
, on pourra définir la palette de couleur utilisée. Pour size
, les tailles minimales et maximales, etc.
Pour modifier une scale existante, on ajoute un nouvel élément à notre objet ggplot2
avec l’opérateur +
. Cet élément prend la forme scale_<attribut>_<type>
.
Voyons tout de suite un exemple
scale_x
, scale_y
Les scales scale_x_<type>
et scale_y_<type>
modifient les axes x
et y
du graphique.
Continuous
scale_x_continuous
et scale_y_continuous
s’appliquent lorsque la variable x
ou y
est numérique (quantitative).
C’est le cas de notre nuage de points croisant part de cadres et part de diplômés du supérieur.
ggplot(rp) +
geom_point(aes(x = dipl_sup, y = cadres))
Limits
Comme on représente des pourcentages, on peut vouloir forcer les axes x
et y
à s’étendre des valeurs 0 à 100. On peut le faire en ajoutant un élément scale_x_continuous
et un élément scale_y_continuous
, et en utilisant leur argument limits
.
ggplot(rp) +
geom_point(aes(x = dipl_sup, y = cadres)) +
scale_x_continuous(limits = c(0,100)) +
scale_y_continuous(limits = c(0,100))
Légende
Là aussi, on peut modifier les étiquettes des axes en indiquant une chaîne de caractères en premier argument.
ggplot(rp) +
geom_point(aes(x = dipl_sup, y = cadres)) +
scale_x_continuous("Part des diplômés du supérieur (%)", limits = c(0,100)) +
scale_y_continuous("Part des cadres (%)", limits = c(0,100))
Autres scale_x_<type>
- On utilise
scale_x_log10
etscale_y_log10
pour passer un axe à une échelle logarithmique. scale_x_discrete
etscale_y_discrete
s’appliquent lorsque l’axe correspond à une variable discrète (qualitative). C’est le cas par exemple de l’axe desx
dans un diagramme en barres. L’argumentlimits
descale_x_discrete
permet d’indiquer quelles valeurs sont affichées et dans quel ordre.
Ressources
La documentation officielle (en anglais) de ggplot2
est très complète et accessible en ligne.
Une “antisèche” (en anglais) résumant en deux pages l’ensemble des fonctions et arguments et disponible soit directement depuis RStudio (menu Help > Cheatsheets > Data visualization with ggplot2) ou en ligne.
Les parties Data visualisation et Graphics for communication de l’ouvrage en ligne R for data science, de Hadley Wickham, sont une très bonne introduction à ggplot2
.
Plusieurs ouvrages, toujours en anglais, abordent en détail l’utilisation de ggplot2
, en particulier ggplot2: Elegant Graphics for Data Analysis, toujours de Hadley Wickham, et le R Graphics Cookbook de Winston Chang.
Le site associé à ce dernier ouvrage comporte aussi pas mal d’exemples et d’informations intéressantes.
Enfin, si ggplot2
présente déjà un très grand nombre de fonctionnalités, il existe aussi un système d’extensions permettant d’ajouter des geom
, des thèmes, etc. Le site ggplot2 extensions est une très bonne ressource pour les parcourir et les découvrir, notamment grâce à sa galerie.