AVIS IMPORTANT
Depuis l'automne 2021, ce wiki a été discontinué et n'est plus activement développé.
Tout le matériel mis à jour et les annonces pour la série d'ateliers R du CSBQ se trouvent maintenant sur le site web de la série d'ateliers R du CSBQ. Veuillez mettre à jour vos signets en conséquence afin d'éviter les documents périmés et/ou les liens brisés.
Merci de votre compréhension,
Vos coordonnateurs de la série d’ateliers R du CSBQ.
Ateliers R du CSBQ
Cette série de 10 ateliers guide les participants à travers les étapes requises afin de maîtriser le logiciel R pour une grande variété d’analyses statistiques pertinentes en recherche en biologie et en écologie. Ces ateliers en libre accès ont été créés par des membres du CSBQ à la fois pour les membres du CSBQ et pour la grande communauté d’utilisateurs de R.
Le contenu de cet atelier a été révisé par plusieurs membres du CSBQ. Si vous souhaitez y apporter des modifications, veuillez SVP contacter les coordonnateurs actuels de la série, listés sur la page d'accueil
Atelier 3: Introduction à ggplot2
Développé par : Xavier Giroux-Bougard, Maxwell Farrell, Amanda Winegardner, Étienne Low-Décarie, Monica Granados
Résumé : Pendant cet atelier, vous perfectionnerez vos compétences en visualisation et manipulation de jeux de données à l'aide de la bibliothèque ggplot2
. Nous explorerons toute la richesse de ggplot2
qui peut être utilisé comme alternative aux outils graphiques de base dans R. Nous apprendrons comment exploiter les outils de cette bibliothèque à la fois pour explorer des données visuellement et pour produire des figures dignes de publications scientifiques.
Lien vers la nouvelle présentation Rmarkdown
S'il vous plaît essayez-la et dites aux coordonnateurs des ateliers R ce que vous en pensez!
Lien vers l'ancienne présentation Prezi
Téléchargez le script R pour cet atelier.
1. Tracer des graphiques avec R en utilisant la grammaire des graphiques (ggplot2)
Que vous effectuiez des statistiques descriptives (e.g. Excel), des analyses plus avancées (e.g. SAS, JMP, SPSS) ou des graphiques et des tableaux (e.g. Sigmaplot, Excel), il est facile de se perdre dans le flux de travail lorsqu'on utilise plusieurs logiciels. Ceci s'avère particulièrement problématique lorsqu'on doit importer ou exporter des données pour effectuer une tâche en aval. À chaque opération, on augmente le risque d'introduire des erreurs dans les données ou de perdre de vue le “bon” fichier de données. Le langage statistique R fournit une solution à ce problème en regroupant tous les outils nécessaires pour manipuler des données, effectuer des analyses statistiques et produire des graphiques sous un seul logiciel. En regroupant notre flux de travail sous le même toit, on réduit la probabilité de faire des erreurs et on rend notre flux de travail beaucoup plus compréhensible et reproductible. Tout ceci en vaut grandement l'effort!
1.1 Intro - ggplot2
Le paquet ggplot2 offre le cadre graphique le plus flexible et de plus complet pour la visualisation des données dans R. Ce paquet a été développé par Hadley Wickham, qui s'est lui-même basé sur la grammaire des graphiques de Leland Wilkinson. Le code source est hébergé sur github : https://github.com/hadley/ggplot2. Aujourd'hui, nous allons regarder les bases de ggplot2
afin que vous puissiez voir tout le potentiel que ce paquet offre pour la visualisation de données.
Avant de débuter, il faut ouvrir RStudio et charger le paquet ggplot2
:
- |
if(!require(ggplot2)){install.packages("ggplot2")} library(ggplot2)
1.2 Graphiques simples avec la fonction ''qplot()''
Utiliser ''qplot()''
Créons un premier graphique à l'aide de la fonction qplot()
du paquet ggplot2
. La fonction qplot()
(qui signifie “quick plot”) sert de lien intuitif entre la fonction de base plot()
et la fonction ggplot()
du paquet ggplot2
. La syntaxe entre plot()
et qplot()
est presque identique : ces fonctions peuvent tracer un graphique en fonction du type de données utilisées (e.g. facteurs, variables numériques, etc.). Rappelez-vous que vous pouvez toujours accéder à la page d'aide d'une fonction de la manière suivante :
- |
?qplot
Si vous avez regardé la page d'aide de la fonction qplot()
, vous avez probablement remarqué que les trois premiers arguments sont :
- data
- x
- y
- …
Charger les données
Avant d'aller plus loin, il faut charger un jeu de données qui nous permettra de réaliser les exercices de l'atelier. Nous utiliserons le jeu de données iris
, un jeu de données bien connu sur les dimensions florales de trois espèces d'iris. Ces données ont été recueillies en Gaspésie par le botaniste américain Edgar Anderson. Le jeu de données est disponible directement dans R. Pour le charger et explorer sa structure, utilisez les commandes suivantes :
Nuage de points
Traçons un premier diagramme de type “nuage de points” de la largeur des sépales en fonction de la longueur des sépales d'iris avec la fonction qplot()
:
TEST
Nuage de points (variables catégoriques)
Il est également possible de tracer un graphique de type “nuage de points” en utilisant une variable catégorique :
Ajouter des étiquettes d'axes et un titre
En plus des données et des variables à spécifier, on peut inclure plusieurs arguments supplémentaires pour améliorer l'aspect d'un graphique (Référez-vous à la page d'aide.). Commençons par ajouter des étiquettes aux axes ainsi qu'un titre à l'aide des arguments xlab/ylab
et main
respectivement :
- |
qplot(data = iris, x = Sepal.Length, xlab = "Longueur (mm)", y = Sepal.Width, ylab = "Largeur (mm)", main = "Dimensions de sépales d'iris")
ggplot2 - Défi #1
À l'aide de la fonction qplot()
, tracez un graphique de type “nuage de points” avec un titre et des étiquettes d'axes. Utilisez le jeu données CO2
ou BOD
qui sont déjà inclus dans R. Vous pouvez les charger et explorer leur structure avec ces commandes :
Solution avec le jeu de données CO2
1.3 La grammaire des graphiques
La grammaire des graphiques est un cadre conceptuel pour la visualisation des données qui permet de décomposer un graphique en plusieurs éléments individuels. L'intérêt majeur de ce cadre est qu'il est possible de modifier chaque élément du graphique séparément. Plusieurs éléments, généralement appelés couches, composent un graphique :
- Éléments esthétiques (aes)
- Objets géométriques (geoms)
- Transformations
- Axes (Système de coordonnées)
- Échelles
Esthétique des graphiques : ''aes()''
Dans ggplot2, les éléments esthétiques sont des paramètres qui spécifient quelles données sont visualisées et comment elle le sont. Voici quelques arguments qui sont utilisés avec la fonction aes()
:
x
: position des données le long de l'axe des xy
: position des données le long de l'axe des ycolour
: couleur d'un élémentgroup
: groupe auquel un élément appartientshape
: forme utilisée pour afficher un pointlinetype
: type de ligne utilisée (e.g. continue, en tireté, etc.)size
: taille d'un point ou d'une lignealpha
: transparence d'un élément
Objets géométriques : ''geoms''
Les objets géométriques ou geoms
déterminent la représentation visuelle des données. Voici plusieurs fonctions qui sont utilisées à cette fin :
geom_point()
: nuage de pointsgeom_line()
: ligne reliant les points par ordre croissant de xgeom_path()
: ligne reliant les points par ordre d'apparitiongeom_boxplot()
: diagramme de boîte à moustaches pour les variables catégoriquesgeom_bar()
: diagramme en bâtons pour les variables catégoriques en axe des xgeom_histogram()
: histogramme (commegeom_bar
, mais pour une variable continue en axe des x)
Comment ça fonctionne
- Créez un objet simple :
objet.graphique <- ggplot() OU qplot()
- Ajoutez des couches :
objet.graphique <- objet.graphique + couche()
- Répétez l'étape 2 jusqu'à ce que vous soyez satisfait et faites apparaître le graphique :
print(objet.graphique)
Le graphique final est produit en superposant plusieurs couches jusqu'à l'obtention d'un résultat satisfaisant :
Ressources supplémentaires
Cette brève introduction à la grammaire des graphiques n'est pas suffisante pour couvrir toutes les couches et caractéristiques possibles pour la visualisation des données. Dans cet atelier, nous vous présentons plus bas les couches et caractéristiques les plus utilisées. Voici quelques ressources supplémentaires afin d'explorer l'immense potentiel de ggplot2
et de la grammaire des graphiques :
- Documentation sur ''ggplot2'': ceci est la meilleure ressource sur ggplot2. Elle inclut une liste complète de tous les éléments disponibles ainsi que la liste des arguments nécessaires pour chaque élément en plus d'exemples très utiles.
- SAPE: le groupe de recherche “Software And Programmer Efficiency” consacre une partie de son site internet à l'usage approprié des différents éléments de ggplot2 en plus de présenter des exemples pertinents.
- The Grammar of Graphics: ce livre écrit par Leland Wilkinson présente le cadre conceptuel de la visualisation des données sur lequel se base ggplot2.
- ggplot2: ce livre par Hadley Wickham, l'auteur de ggplot2, montre comment implémenter la grammaire des graphiques dans R.
1.4 Graphiques avancés avec la fonction ''ggplot()''
''qplot()'' vs ''ggplot()''
La fonction qplot()
est idéale pour tracer des graphiques rapidement. Tel que mentionné plus haut, si on assigne un graphique qplot
à un objet, il est ensuite possible d'ajouter des couches pour augmenter la complexité du graphique : objet.graphique <- objet.graphique + couche()
. Cependant, la fonction qplot()
ne fait que reprendre les commandes de la fonction ggplot()
dans un format similaire à celui de la fonction de base plot()
. Regardons la syntaxe sous-jacente de ggplot2
lorsqu'on utilise la fonction qplot()
.
qplot()
:
- |
qplot(data = iris, x = Sepal.Length, xlab = "Longueur (mm)", y = Sepal.Width, ylab = "Largeur (mm)", main = "Dimensions de sépales d'iris")
ggplot()
:
- |
ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point() + xlab("Longueur (mm)") + ylab("Largeur (mm)") + ggtitle("Dimensions de sépales d'iris")
Lorsqu'on utilise la fonction ggplot()
directement, on spécifie tout d'abord les données et les variables x
et y
avec aes()
. Ensuite, on ajoute chaque couche une à la fois. Cette façon de faire permet d'utiliser le plein potentiel de la grammaire des graphiques. Il est préférable d'utiliser la fonction ggplot()
lorsqu'on dois tracer des graphiques plus complexes. C'est ce que nous ferons pour le reste de cet atelier.
Attribuer un graphique à un objet
Avant d'aller plus loin avec les fonctions avancées, créons un objet graphique de base en assignant le graphique précédent à un objet :
- |
graph.base <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point() + xlab("Longueur (mm)") + ylab("Largeur (mm)") + ggtitle("Dimensions de sépales d'iris")
1.5 Ajouter des couleurs et des formes
L'argument colour
de la fonction aes()
permet d'ajouter des couleurs. L'argument shape
permet d'attribuer un symbole unique à chaque groupe :
- |
graph.base <- graph.base + aes(colour = Species, shape = Species) graph.base
1.6 Ajouter des objets géométriques
Nous avons déjà des objets géométriques dans notre graphique de base (i.e. des points ajoutés avec la fonction geom_points()
). Ajoutons maintenant des lignes de régression avec la fonction geom_smooth()
:
- |
graph.ligne <- graph.base + geom_smooth(method="lm", se = FALSE) graph.ligne
ggplot2 - Défi #2
Créez un graphique coloré avec une droite de régression (ou autres “smoothing”) à partir des jeux de données CO2
ou msleep
de R :
Solution avec le jeu de données CO2
1.7 Séparer les graphiques en panneaux
La visualisation des données peut être difficile lorsque plusieurs facteurs sont inclus dans une expérience. Par exemple, le jeu de données CO2
contient des données d'absorption de CO2 pour des plantes refroidies et des plantes non refroidies dans deux régions différentes (Québec et Mississippi). Commençons par créer un graphique de base :
- |
data(CO2) CO2.graph <- ggplot(data = CO2, aes(x = conc, y = uptake, colour = Treatment)) + geom_point() + xlab("Concentration en CO2 (mL/L)") + ylab("Absorption de CO2 (umol/m^2 sec)") + ggtitle("Absorption de CO2 par une espèce de graminée") CO2.graph
Si on veut comparer les résultats d'absorption par région, ça peut être utile de représenter les données dans deux panneaux où les axes sont alignés afin de faciliter la comparaison. Avec ggplot2
, la fonction facet_grid()
permet de découper le graphique en différents groupes. La syntaxe générale est décrite ainsi : plot.object + facet_grid(lignes ~ colonnes)
. Ici, lignes
et colonnes
sont des facteurs du tableau de données qu'on souhaite comparer en séparant les données par panneau. Pour comparer les deux régions, on peut utiliser le script suivant :
- |
CO2.graph <- CO2.graph + facet_grid(. ~ Type) CO2.graph
Note : Il est possible de tracer les panneaux verticalement facet.grid(Type ~ .)
.
1.8 Ajouter des groupes
On peut ajouter des droites de régression de l'abosorption du CO2 en fonction de la concentration en CO2 pour chaque région à l'aide de la fonction geom_line()
:
- |
CO2.graph + geom_line()
Les points sont reliés verticalement pour chaque niveau de concentration en CO2. Si on regarde plus en détail la structure du jeu de données CO2
, on note que chaque niveau de concentration est répété trois fois par région. Si on veut tracer une droite pour chaque répétition, il faut ajouter l'élément esthétique group
à la fonction “geom_line()” :
- |
CO2.graph <- CO2.graph + geom_line(aes(group = Plant)) CO2.graph
ggplot2 - Défi #3
Familiarisez-vous avec un nouvel objet géométrique et d'autres éléments graphiques. Utilisez votre propre jeu de données ou un jeu de données déjà inclus dans R (Tapez data()
pour la liste des jeux de données disponibles). Regardez cette page pour un peu d'inspiration !
- |
data(msleep) data(OrchardSprays)
Exemple avec le jeu de données "OrchardSprays"
1.9 Enregistrer un graphique
Plusieurs options s'offrent à vous lorsque vient le temps d'enregistrer un graphique.
Enregistrer un graphique avec RStudio
Avec RStudio, plusieurs options sont disponibles pour enregistrer les graphiques. Vous pouvez les copier dans le presse-papiers ou les exporter vers à peu près n'importe quel type de fichier graphique (png, jpg, emf, tiff, pdf, metafile, etc.) :
Enregistrer un graphique avec un script
Lorsque que vous devez reproduire plusieurs graphiques (e.g. lors d'une analyse qui crée plusieurs graphiques automatiquement), c'est utile d'enregistrer tous ces graphiques dans un seul fichier pdf. La commande suivante permet de réaliser ceci :
Enregistrer un graphique - autres options
Il existe encore plusieurs autres options, mais parmi celles-ci, ggsave()
est particulièrement utile. Cette fonction nous permet d'enregistrer nos graphiques sous multiples formats graphiques, en plus de nous permettre de spécifier les dimensions exactes du produit final:
1.10 Ajustement de précision - couleurs
Le paquet ggplot2
choisit automatiquement les couleurs d'un graphique en se basant sur le cercle chromatique et le nombre de couleurs nécessaires pour réaliser le graphique. Cependant, si vous désirez spécifier vous-même les couleurs à utiliser, vous devez inclure la fonction scale_colour_manual()
dans votre script :
Pour un contrôle manuel encore plus précis, vous pouvez spécifier les codes hexadécimaux des couleurs à utiliser.
Un paquet particulièrement simple et utile pour les couleurs s'agit de viridis
. Celui-ci offre 4 palettes de couleurs développée pour les visulalizations cartographiques. Les 4 palettes offrent des contrastes riches, et conservent leur informations lorsqu'elles sont converties sur échelle noir-blanc. Voici un example:
- |
CO2.graph + scale_colour_manual(values = viridis(2, option = "D"))
BONUS
Allez jeter un coup d'oeil aux liens/paquets suivants pour plus d'options de couleurs :
- Cookbook for R: cette section du “Cookbook for R” sur ggplot2 présente beaucoup d'idées et de chartes de couleurs.
- RColorBrewer: ce paquet de R est rempli de gradients de couleurs pouvant être intégrés à ggplot2 avec la fonction
scale_color_brewer()
. - WesAnderson: ce paquet de R, disponible via GitHub, est rempli de thématiques de couleurs basées sur les films de Wes Anderson !
1.11 Ajustement de précision - axes et échelles
Il est possible de contrôler l'aspect des axes et les échelles utilisées pour représenter les données (e.g. étendue de l'axe, positions, etc.) :
- |
CO2.graph + scale_y_continuous(name = "Taux d'absorption de CO2", breaks = seq(5, 50, by = 10), labels = seq(5, 50, by = 10), trans = "log10")
1.12 Ajustement de précision - thèmes
Les thèmes permettent de créer des graphiques et des figures de très haute qualité. Les thèmes permettent de contrôler les éléments esthétiques qui ne sont pas directement reliés aux données (e.g. couleur d'arrière-plan, type de police, format de la légende, etc.).
L'arrière-plan gris par défaut ne vous enchante peut-être pas… Rassurez-vous ! Comme n'importe quel autre aspect dû à la grammaire des graphiques, vous pouvez modifier l'allure d'un graphique selon vos besoins ou votre sens de l'esthétisme. Voici comment faire :
- |
objet.graph + theme()
Il existe une très grande quantité de thèmes inclus dans le paquet ggplot2; vous trouverez la liste complète ici. Vous n'êtes pas obligés de spécifier tous les éléments contenus dans la fonction theme()
: vous pouvez débuter avec un thème déjà établi (i.e. avec des paramètres de départ). Par exemple, on peut utiliser le thème “noir et blanc” de la manière suivante :
- |
CO2.graph + theme_bw() # L'arrière-plan est devenu blanc !
Créer son propre thème
Il est très facile de créer son propre thème. Ça peut être très pratique pour produire des figures selon un format précis (e.g. pour une revue scientifique). Le plus simple est de partir d'un thème existant et de modifier ses paramètres :
- |
mon.theme <- theme_bw() + theme(plot.title = element_text(colour = "red")) + theme(legend.position = c(0.9, 0.9)) CO2.graph + mon.theme # On a modifié la couleur du titre et la position de la légende # du thème "noir et blanc".
Le paquet ggtheme
Le paquet ggtheme est un projet intéressant développé par Jeffrey Arnold. Vous savez comment l'installer :
- |
install.packages("ggthemes") library(ggthemes)
Ce paquet contient plusieurs thèmes, objets géométriques et gradients de couleurs adaptés pour ggplot2. Plusieurs éléments sont basés sur les travaux de personnes influentes dans le domaine de la visualisation des données tel qu'Edward Tufte ou sur les publications des journalistes et programmeurs du blog FiveThirtyEight.
Voici un petit exemple rapide qui utilise les diagrammes de boîte à moustaches de Tufte. Comme vous pouvez le constater, c'est très minimaliste :
- |
data(OrchardSprays) tufte.box <- ggplot(data = OrchardSprays, aes(x = treatment, y = decrease)) + geom_tufteboxplot() + theme_tufte() tufte.box
1.13 ggplot avec un interface utilisateur graphique
Il n'y a aucun mal à utiliser une interface utilisateur graphique pour produire des figures ! Jeroen Schouten, un programmeur de très haut niveau, a rapidement compris que la courbe d'apprentissage de R peut être très à pic pour les débutants. C'est pourquoi il a créé une interface utilisateur graphique en ligne pour ggplot2. Ce n'est peut-être pas aussi efficace que de coder directement les principes de la grammaires des graphiques, mais c'est quand même très complet. Vous pouvez importer des données provenant d'Excel, Google Spreadsheets ou de tout autre format et créer des figures en vous basant sur les tutoriels disponibles. Un aspect intéressant est que vous pouvez voir le code utilisé une fois le graphique réalisé. Vous pouvez donc copier-coller ce code dans R et l'utiliser pour générer des graphiques plus complexes (e.g. incluant différents thèmes).
4. Ressources supplémentaires
Voici quelques ressources intéressantes pour continuer votre apprentissage du paquet ggplot2
. On s'en est d'ailleurs servi comme inspiration pour la matériel couvert aujourd'hui :
ggplot2
Notes du cours Stat 405 de Hadley Wickham (les autres cours sont également géniaux !)
BONUS ! Allez jeter un coup d'oeil sur le format des scripts recommandé par Hadley afin de faciliter la compréhension et le partage de ceux-ci :
- r_atelier3.txt
- Last modified: 2021/10/13 23:50
- by lsherin