Visualisation de données
Dernière mise à jour le 2024-09-12 | Modifier cette page
Vue d'ensemble
Questions
- Visualisation en R
Objectifs
- Produisez des nuages de points, des boxplots, des tracés linéaires, etc. en utilisant ggplot.
- Définissez les paramètres de tracé universels.
- Décrivez ce qu’est le facettage et appliquez le facettage dans ggplot.
- Modifiez l’esthétique d’un tracé ggplot existant (y compris les étiquettes des axes et la couleur).
- Créez des tracés complexes et personnalisés à partir de données dans un bloc de données.
Cet épisode est basé sur la leçon Analyse des données et Visualisation dans R pour les écologistes de Data Carpentries.
Visualisation de données
Nous commençons par charger les packages requis.
ggplot2
est inclus dans le package
tidyverse
.
R
bibliothèque("tidyverse")
ERREUR
Error in bibliothèque("tidyverse"): could not find function "bibliothèque"
Si vous n’êtes pas encore dans l’espace de travail, chargez les données que nous avons enregistrées dans la leçon précédente.
R
arn <- read.csv("data/rnaseq.csv")
La Data Visualization Cheat
couvrira les bases et les fonctionnalités plus avancées de
ggplot2
et aidera, en plus de servir de rappel, à obtenir
un aperçu des nombreuses représentations de données disponibles dans le
package. Les didacticiels vidéo suivants (partie 1 et 2) de Thomas
Lin Pedersen sont également très instructifs.
Tracer avec ggplot2
ggplot2
est un package de traçage qui simplifie la
création de tracés complexes à partir de données dans un bloc de
données. Il fournit une interface plus programmatique pour spécifier les
variables à tracer, comment elles sont affichées, et les propriétés
visuelles générales. La fondation théorique qui prend en charge le
ggplot2
est la Grammar of Graphics (@Wilkinson :2005). En utilisant cette approche ,
nous n’avons besoin que de changements minimes si les données
sous-jacentes changent ou si nous décidons de passer d’un diagramme à
barres à un nuage de points. Cela aide à créer des tracés de qualité de
publication avec un minimum d’ajustements et de peaufinages.
Il existe un livre sur ggplot2
(@ggplot2book) qui fournit un bon aperçu de ,
mais il est obsolète. La 3ème édition est en préparation et sera disponible gratuitement en ligne.
La page Web ggplot2
(https://ggplot2.tidyverse.org)
fournit une documentation abondante.
ggplot2
fonctionne comme des données au format « long »,
c’est-à-dire une colonne pour chaque dimension et une ligne pour chaque
observation. Des données bien structurées vous feront gagner beaucoup de
temps lors de la création de chiffres avec ggplot2
.
Les graphiques ggplot sont construits étape par étape en ajoutant de nouveaux éléments. L’ajout de couches de cette manière permet une grande flexibilité et une personnalisation des tracés.
L’idée derrière la grammaire graphique est que vous pouvez construire chaque graphique à partir des 3 mêmes composants : (1) un ensemble de données, (2) un système de coordonnées, et (3) des géoms. — c’est-à-dire des marques visuelles qui représentent des points de données [^trois\_comp\_ggplot2]
Pour construire un ggplot, nous utiliserons le modèle de base suivant qui peut être utilisé pour différents types de tracés :
ggplot(data = <DATA>, mapping = aes(<MAPPINGS>)) + <GEOM_FUNCTION>()
- utilisez la fonction
ggplot()
et liez le tracé à un cadre **data ** spécifique en utilisant l’argumentdata
R
ggplot(data = rna)
- définir un mapping (en utilisant la fonction
esthétique (
aes
)), en sélectionnant les variables à tracer et en spécifiant comment les présenter dans le graphique, par exemple sous la forme x/ y positions ou caractéristiques telles que taille, forme, couleur, etc.
R
ggplot(data = rna, mapping = aes(x = expression))
-
ajoutez ‘geoms’ - géométries ou représentations graphiques des données dans le tracé (points, lignes, barres).
ggplot2
propose de nombreuses géométries différentes ; nous en utiliserons quelques-uns courants aujourd’hui, notamment :* `geom_point()` pour les nuages de points, les diagrammes de points, etc. * `geom_histogram()` pour les histogrammes * `geom_boxplot()` pour, eh bien, les boxplots ! * `geom_line()` pour les lignes de tendance, les séries chronologiques, etc.
Pour ajouter une géométrie au tracé, utilisez l’opérateur
+
. Utilisons d’abord geom_histogram()
:
R
ggplot(data = rna, mapping = aes(x = expression)) +
geom_histogram()
ERREUR
Error in ggplot(data = rna, mapping = aes(x = expression)): could not find function "ggplot"
Le +
dans le package ggplot2
est
particulièrement utile car il vous permet de modifier les objets
ggplot
existants. Cela signifie que vous pouvez facilement
configurer des modèles de tracé et explorer facilement différents types
de tracés, de sorte que le tracé ci-dessus peut également être généré
avec un code comme celui-ci :
R
# Assign plot to a variable
rna_plot <- ggplot(data = rna,
mapping = aes(x = expression))
# Draw the plot
rna_plot + geom_histogram()
R
# change bins
ggplot(rna, aes(x = expression)) +
geom_histogram(bins = 15)
ERREUR
Error in ggplot(rna, aes(x = expression)): could not find function "ggplot"
R
# change binwidth
ggplot(rna, aes(x = expression)) +
geom_histogram(binwidth = 2000)
ERREUR
Error in ggplot(rna, aes(x = expression)): could not find function "ggplot"
Nous pouvons observer ici que les données sont biaisées vers la
droite. Nous pouvons appliquer la transformation log2 pour avoir une
distribution plus symétrique. Notez que nous ajoutons ici une petite
valeur constante (+1
) pour éviter que les valeurs
-Inf
soient renvoyées pour les valeurs d’expression égales
à 0.
R
arn <- arn %>%
muter(expression_log = log2(expression + 1))
ERREUR
Error in arn %>% muter(expression_log = log2(expression + 1)): could not find function "%>%"
Si l’on dessine maintenant l’histogramme des expressions transformées en log2, la distribution est en effet plus proche d’une distribution normale.
R
ggplot(rna, aes(x = expression_log)) + geom_histogram()
ERREUR
Error in ggplot(rna, aes(x = expression_log)): could not find function "ggplot"
À partir de maintenant, nous travaillerons sur les valeurs d’expression transformées en log.
Défi
Une autre façon de visualiser cette transformation est de considérer l’échelle des observations. Par exemple, il peut être intéressant de changer l’échelle de l’axe pour mieux répartir les observations dans l’espace de la parcelle . Changer l’échelle des axes se fait de la même manière que ajouter/modifier d’autres composants (c’est-à-dire en ajoutant progressivement des commandes ). Essayez de faire cette modification :
- Représenter l’expression non transformée sur l’échelle log10 ; voir
scale_x_log10()
. Comparez-le avec le graphique précédent. Pourquoi des messages d’avertissement apparaissent-ils maintenant ?
R
ggplot(data = rna,mapping = aes(x = expression))+
geom_histogram() +
scale_x_log10()
ERREUR
Error in ggplot(data = rna, mapping = aes(x = expression)): could not find function "ggplot"
Remarques
- Tout ce que vous mettez dans la fonction
ggplot()
peut être vu par n’importe quelle couche geom que vous ajoutez (c’est-à-dire qu’il s’agit de paramètres de tracé globaux). Ce inclut le mappage des axes x et y que vous avez configuré dansaes()
. - Vous pouvez également spécifier des mappages pour une géom donnée
indépendamment des mappages définis globalement dans la fonction
ggplot()
. - Le signe
+
utilisé pour ajouter de nouveaux calques doit être placé à la fin de la ligne contenant le calque précédent. If, instead, the+
sign is added at the beginning of the line containing the new layer,ggplot2
will not add the new layer and will return an error message.
R
# This is the correct syntax for adding layers
rna_plot +
geom_histogram()
# This will not add the new layer and will return an error message
rna_plot
+ geom_histogram()
Construire vos parcelles de manière itérative
Nous allons maintenant dessiner un nuage de points avec deux
variables continues et la fonction geom_point()
. Ce
graphique représentera les changements de pli log2 de l’expression
comparant le temps 8 au temps 0 et le temps 4 au temps 0. À cette fin,
nous devons d’abord calculer les moyennes des valeurs d’expression
transformées en log par gène et par temps, puis le pli du log change en
en soustrayant les expressions du log moyen entre le temps 8 et le temps
0. et entre le temps 4 et le temps 0. Notez que nous incluons également
ici le biotype du gène que nous utiliserons plus tard pour représenter
les gènes. Nous enregistrerons les changements de repli dans un nouveau
bloc de données appelé rna_fc.
R
rna_fc <- rna %>% select(gene, time,
gene_biotype, expression_log) %>%
group_by(gene, time, gene_biotype) %>%
summary(mean_exp = moyenne (expression_log)) %>%
pivot_wider(names_from = temps,
valeurs_from = moyenne_exp) %>%
mutate(time_8_vs_0 = `8` - `0`, time_4_vs_0 = `4` - `0`)
ERREUR
Error in rna %>% select(gene, time, gene_biotype, expression_log) %>% : could not find function "%>%"
Nous pouvons ensuite construire un ggplot avec l’ensemble de données
nouvellement créé rna_fc
. Construire des parcelles avec
ggplot2
est généralement un processus itératif. Nous
commençons par définir l’ensemble de données que nous allons utiliser,
tracer les axes et choisir une géom :
R
ggplot(data = rna_fc, mapping = aes(x = time_4_vs_0, y = time_8_vs_0)) +
geom_point()
ERREUR
Error in ggplot(data = rna_fc, mapping = aes(x = time_4_vs_0, y = time_8_vs_0)): could not find function "ggplot"
Ensuite, nous commençons à modifier ce tracé pour en extraire plus d’informations. Par exemple, nous pouvons ajouter de la transparence (« alpha ») pour éviter le surtraçage :
R
ggplot(data = rna_fc, mapping = aes(x = time_4_vs_0, y = time_8_vs_0)) +
geom_point(alpha = 0.3)
ERREUR
Error in ggplot(data = rna_fc, mapping = aes(x = time_4_vs_0, y = time_8_vs_0)): could not find function "ggplot"
On peut également ajouter des couleurs pour tous les points :
R
ggplot(data = rna_fc, mapping = aes(x = time_4_vs_0, y = time_8_vs_0)) +
geom_point(alpha = 0.3, color = "blue")
ERREUR
Error in ggplot(data = rna_fc, mapping = aes(x = time_4_vs_0, y = time_8_vs_0)): could not find function "ggplot"
Ou pour colorer différemment chaque gène du tracé, vous pouvez
utiliser un vecteur comme entrée dans l’argument color.
ggplot2
fournira une couleur différente correspondant à
différentes valeurs dans le vecteur. Voici un exemple où nous colorons
avec gene_biotype
:
R
ggplot(data = rna_fc, mapping = aes(x = time_4_vs_0, y = time_8_vs_0)) +
geom_point(alpha = 0.3, aes(color = gene_biotype))
ERREUR
Error in ggplot(data = rna_fc, mapping = aes(x = time_4_vs_0, y = time_8_vs_0)): could not find function "ggplot"
Nous pouvons également spécifier les couleurs directement à
l’intérieur du mappage fourni dans la fonction ggplot()
.
Cela sera visible par toutes les couches géométriques et la cartographie
sera déterminée par les axes x et y définis dans aes()
.
R
ggplot(data = rna_fc, mapping = aes(x = time_4_vs_0, y = time_8_vs_0,
color = gene_biotype)) +
geom_point(alpha = 0.3)
ERREUR
Error in ggplot(data = rna_fc, mapping = aes(x = time_4_vs_0, y = time_8_vs_0, : could not find function "ggplot"
Enfin, nous pourrions également ajouter une ligne diagonale avec la
fonction geom_abline()
:
R
ggplot(data = rna_fc, mapping = aes(x = time_4_vs_0, y = time_8_vs_0,
color = gene_biotype)) +
geom_point(alpha = 0.3) +
geom_abline(intercept = 0)
ERREUR
Error in ggplot(data = rna_fc, mapping = aes(x = time_4_vs_0, y = time_8_vs_0, : could not find function "ggplot"
Notez que nous pouvons changer la couche géométrique de
geom_point
à geom_jitter
et les couleurs
seront toujours déterminées par gene_biotype
.
R
ggplot(data = rna_fc, mapping = aes(x = time_4_vs_0, y = time_8_vs_0,
color = gene_biotype)) +
geom_jitter(alpha = 0.3) +
geom_abline(intercept = 0)
ERREUR
Error in ggplot(data = rna_fc, mapping = aes(x = time_4_vs_0, y = time_8_vs_0, : could not find function "ggplot"
ERREUR
Error in bibliothèque("hexbin"): could not find function "bibliothèque"
Défi
Les nuages de points peuvent être des outils d’exploration utiles
pour de petits ensembles de données. Pour les ensembles de données avec
un grand nombre d’observations, tels que l’ensemble de données
rna_fc
, le surtraçage des points peut constituer une
limitation des nuages de points. Une stratégie pour gérer de tels
paramètres consiste à utiliser le regroupement hexagonal d’observations
. L’espace de l’intrigue est divisé en hexagones. Chaque hexagone se
voit attribuer une couleur en fonction du nombre d’observations qui
tombent dans ses limites.
Pour utiliser le regroupement hexagonal dans
ggplot2
, installez d’abord le package Rhexbin
depuis CRAN et chargez-le.Utilisez ensuite la fonction
geom_hex()
pour produire la figure hexbin.Quelles sont les forces et les faiblesses relatives d’un diagramme hexagonal par rapport à un nuage de points ? Examinez le nuage de points ci-dessus et comparez-le avec le diagramme hexagonal que vous avez créé.
R
install.packages("hexbin")
R
library("hexbin")
ERREUR
Error in library("hexbin"): there is no package called 'hexbin'
R
ggplot(data = rna_fc, mapping = aes(x = time_4_vs_0, y = time_8_vs_0)) +
geom_hex() +
geom_abline(intercept = 0)
ERREUR
Error in ggplot(data = rna_fc, mapping = aes(x = time_4_vs_0, y = time_8_vs_0)): could not find function "ggplot"
R
ggplot(data = rna, mapping = aes(y = expression_log, x = sample)) +
geom_point(aes(color = time))
ERREUR
Error in ggplot(data = rna, mapping = aes(y = expression_log, x = sample)): could not find function "ggplot"
Boîte à moustaches
Nous pouvons utiliser des boxplots pour visualiser la distribution des expressions géniques au sein de chaque échantillon :
R
ggplot(data = rna,
mapping = aes(y = expression_log, x = sample)) +
geom_boxplot()
ERREUR
Error in ggplot(data = rna, mapping = aes(y = expression_log, x = sample)): could not find function "ggplot"
En ajoutant des points au boxplot, on peut avoir une meilleure idée du nombre de mesures et de leur répartition :
R
ggplot(data = rna,
mapping = aes(y = expression_log, x = sample)) +
geom_jitter(alpha = 0.2, color = "tomato") +
geom_boxplot(alpha = 0)
ERREUR
Error in ggplot(data = rna, mapping = aes(y = expression_log, x = sample)): could not find function "ggplot"
Nous devrions inverser l’ordre de ces deux géométries :
R
ggplot(data = rna,
mapping = aes(y = expression_log, x = sample)) +
geom_boxplot(alpha = 0) +
geom_jitter(alpha = 0.2, color = "tomato")
ERREUR
Error in ggplot(data = rna, mapping = aes(y = expression_log, x = sample)): could not find function "ggplot"
Vous remarquerez peut-être que les valeurs sur l’axe des x ne sont toujours pas correctement lisibles. Modifions l’orientation des étiquettes et ajustons-les verticalement et horizontalement afin qu’elles ne se chevauchent pas. Vous pouvez utiliser un angle de 90 degrés ou expérimenter pour trouver l’angle approprié pour les étiquettes orientées en diagonale :
R
ggplot(data = rna,
mapping = aes(y = expression_log, x = sample)) +
geom_jitter(alpha = 0.2, color = "tomato") +
geom_boxplot(alpha = 0) +
theme(axis.text.x = element_text(angle = 90, hjust = 0.5, vjust = 0.5))
ERREUR
Error in ggplot(data = rna, mapping = aes(y = expression_log, x = sample)): could not find function "ggplot"
Défi
Ajoutez de la couleur aux points de données sur votre boxplot en fonction de la durée de l’infection (« time »).
Indice : Vérifiez la classe pour « heure ». Envisagez de
changer la classe de time
d’entier pour prendre en compte
directement dans le mappage ggplot. Pourquoi cela change-t-il la façon
dont R crée le graphique ?
R
# time as integer
ggplot(data = rna,
mapping = aes(y = expression_log,
x = sample)) +
geom_jitter(alpha = 0.2, aes(color = time)) +
geom_boxplot(alpha = 0) +
theme(axis.text.x = element_text(angle = 90, hjust = 0.5, vjust = 0.5))
ERREUR
Error in ggplot(data = rna, mapping = aes(y = expression_log, x = sample)): could not find function "ggplot"
R
# time as factor
ggplot(data = rna,
mapping = aes(y = expression_log,
x = sample)) +
geom_jitter(alpha = 0.2, aes(color = as.factor(time))) +
geom_boxplot(alpha = 0) +
theme(axis.text.x = element_text(angle = 90, hjust = 0.5, vjust = 0.5))
ERREUR
Error in ggplot(data = rna, mapping = aes(y = expression_log, x = sample)): could not find function "ggplot"
Défi
Les boxplots sont des résumés utiles, mais cachent la forme de la distribution . Par exemple, si la distribution est bimodale, nous ne la verrions pas dans un boxplot. Une alternative au boxplot est le tracé en violon , où la forme (de la densité de points) est dessinée.
- Remplacez la boîte à moustaches par une intrigue en violon ; voir
geom_violin()
. Remplissez les violons en fonction du temps avec l’argumentfill
.
R
ggplot(data = rna,
mapping = aes(y = expression_log, x = sample)) +
geom_violin(aes(fill = as.factor(time))) +
theme(axis.text.x = element_text(angle = 90, hjust = 0.5, vjust = 0.5))
ERREUR
Error in ggplot(data = rna, mapping = aes(y = expression_log, x = sample)): could not find function "ggplot"
R
ggplot(data = rna,
mapping = aes(y = expression_log, x = sample)) +
geom_violin(aes(fill = sex)) +
theme(axis.text.x = element_text(angle = 90, hjust = 0.5, vjust = 0.5))
ERREUR
Error in ggplot(data = rna, mapping = aes(y = expression_log, x = sample)): could not find function "ggplot"
Tracés linéaires
Calculons l’expression moyenne par durée de l’infection pour les 10
gènes ayant les changements logarithmiques les plus élevés en comparant
le temps 8 au temps 0. Tout d’abord, nous devons sélectionner les gènes
et créer un sous-ensemble de rna
appelé
sub_rna
contenant les 10 gènes sélectionnés, puis nous
devons regrouper les données et calculer l’expression moyenne des gènes
dans chaque groupe:
R
rna_fc <- rna_fc %>% arrange(desc(time_8_vs_0))
ERREUR
Error in rna_fc %>% arrange(desc(time_8_vs_0)): could not find function "%>%"
R
genes_selected <- rna_fc$gene[1:10]
ERREUR
Error in eval(expr, envir, enclos): object 'rna_fc' not found
R
sub_rna <- rna %>%
filter(gene %in% genes_selected)
ERREUR
Error in rna %>% filter(gene %in% genes_selected): could not find function "%>%"
R
mean_exp_by_time <- sub_rna %>%
group_by(gene,time) %>%
summarize(mean_exp = mean(expression_log))
ERREUR
Error in sub_rna %>% group_by(gene, time) %>% summarize(mean_exp = mean(expression_log)): could not find function "%>%"
R
mean_exp_by_time
ERREUR
Error in eval(expr, envir, enclos): object 'mean_exp_by_time' not found
Nous pouvons construire le tracé linéaire avec la durée de l’infection sur l’axe des x et l’expression moyenne sur l’axe des y :
R
ggplot(data = moyenne_exp_by_time, mapping = aes(x = temps, y = moyenne_exp)) +
geom_line()
ERREUR
Error in ggplot(data = moyenne_exp_by_time, mapping = aes(x = temps, y = moyenne_exp)): could not find function "ggplot"
Malheureusement, cela ne fonctionne pas car nous avons tracé ensemble
les données de tous les gènes . Nous devons dire à ggplot de tracer une
ligne pour chaque gène en modifiant la fonction esthétique pour inclure
group = gene
:
R
ggplot(data = moyenne_exp_by_time,
mapping = aes(x = temps, y = moyenne_exp, groupe = gène)) +
geom_line()
ERREUR
Error in ggplot(data = moyenne_exp_by_time, mapping = aes(x = temps, y = moyenne_exp, : could not find function "ggplot"
Nous pourrons distinguer les gènes dans l’intrigue si nous ajoutons
des couleurs (l’utilisation de color
regroupe également
automatiquement les données) :
R
ggplot(data = moyenne_exp_by_time,
mapping = aes(x = temps, y = moyenne_exp, couleur = gène)) +
geom_line()
ERREUR
Error in ggplot(data = moyenne_exp_by_time, mapping = aes(x = temps, y = moyenne_exp, : could not find function "ggplot"
Facettage
ggplot2
a une technique spéciale appelée
faceting qui permet à l’utilisateur de diviser une parcelle en
plusieurs (sous) parcelles en fonction d’un facteur inclus dans
l’ensemble de données. Ces différentes sous-parcelles héritent des mêmes
propriétés (limites des axes, ticks, …) pour faciliter leur comparaison
directe. Nous allons l’utiliser pour créer un tracé linéaire dans le
temps pour chaque gène :
R
ggplot(data = moyenne_exp_by_time,
mapping = aes(x = temps, y = moyenne_exp)) + geom_line() +
facet_wrap(~ gène)
ERREUR
Error in ggplot(data = moyenne_exp_by_time, mapping = aes(x = temps, y = moyenne_exp)): could not find function "ggplot"
Ici, les axes x et y ont la même échelle pour toutes les
sous-parcelles. Vous pouvez changer ce comportement par défaut en
modifiant scales
afin d’autoriser une échelle libre pour
l’axe y :
R
ggplot(data = moyenne_exp_by_time,
mapping = aes(x = temps, y = moyenne_exp)) +
geom_line() +
facet_wrap(~ gene, scales = "free_y")
ERREUR
Error in ggplot(data = moyenne_exp_by_time, mapping = aes(x = temps, y = moyenne_exp)): could not find function "ggplot"
Nous aimerions maintenant diviser la ligne dans chaque parcelle selon le sexe des souris. Pour ce faire, nous devons calculer l’expression moyenne dans le bloc de données regroupé par « gène », « temps » et « sexe » :
R
Mean_exp_by_time_sex <- sub_rna %>%
group_by(gene, time, sex) %>%
summary(mean_exp = Mean(expression_log))
ERREUR
Error in sub_rna %>% group_by(gene, time, sex) %>% summary(mean_exp = Mean(expression_log)): could not find function "%>%"
R
Mean_exp_by_time_sex
ERREUR
Error in eval(expr, envir, enclos): object 'Mean_exp_by_time_sex' not found
Nous pouvons maintenant créer le tracé à facettes en le divisant
davantage par sexe en utilisant color
(au sein d’un seul
tracé) :
R
ggplot(data = moyenne_exp_by_time_sex,
mapping = aes(x = temps, y = moyenne_exp, couleur = sexe)) +
geom_line() +
facet_wrap(~ gène, échelles = "free_y")
ERREUR
Error in ggplot(data = moyenne_exp_by_time_sex, mapping = aes(x = temps, : could not find function "ggplot"
Généralement, les tracés sur fond blanc semblent plus lisibles une
fois imprimés. Nous pouvons définir l’arrière-plan en blanc en utilisant
la fonction theme_bw()
. De plus, nous pouvons supprimer la
grille :
R
ggplot(data = moyenne_exp_by_time_sex,
mapping = aes(x = temps, y = moyenne_exp, couleur = sexe)) +
geom_line() +
facet_wrap(~ gène, échelles = "free_y") +
theme_bw() +
theme(panel.grid = element_blank())
ERREUR
Error in ggplot(data = moyenne_exp_by_time_sex, mapping = aes(x = temps, : could not find function "ggplot"
R
Mean_exp_by_chromosome <- rna %>%
group_by(chromosome_name, time) %>%
summary(mean_exp = Mean(expression_log))
ERREUR
Error in rna %>% group_by(chromosome_name, time) %>% summary(mean_exp = Mean(expression_log)): could not find function "%>%"
R
ggplot(data = Mean_exp_by_chromosome, mapping = aes( x = temps,
y = moyenne_exp)) +
geom_line() +
facet_wrap(~ chromosome_name, scales = "free_y")
ERREUR
Error in ggplot(data = Mean_exp_by_chromosome, mapping = aes(x = temps, : could not find function "ggplot"
La géométrie facet_wrap
extrait les tracés dans un
nombre arbitraire de dimensions pour leur permettre de s’adapter
proprement à une seule page. On the other hand, the
facet_grid
geometry allows you to explicitly specify how
you want your plots to be arranged via formula notation
(rows ~ columns
; a .
can be used as a
placeholder that indicates only one row or column).
Modifions le graphique précédent pour comparer l’évolution de l’expression génétique moyenne des hommes et des femmes au fil du temps :
R
# Une colonne, facette par lignes
ggplot(data = Mean_exp_by_time_sex,
mapping = aes(x = time, y = Mean_exp, color = gene)) +
geom_line() +
facet_grid(sexe ~ .)
ERREUR
Error in ggplot(data = Mean_exp_by_time_sex, mapping = aes(x = time, y = Mean_exp, : could not find function "ggplot"
R
# Une ligne, facette par colonne
ggplot(data = Mean_exp_by_time_sex,
mapping = aes(x = time, y = Mean_exp, color = gene)) +
geom_line() +
facet_grid(. ~ sexe)
ERREUR
Error in ggplot(data = Mean_exp_by_time_sex, mapping = aes(x = time, y = Mean_exp, : could not find function "ggplot"
Thèmes ggplot2
En plus de theme_bw()
, qui change l’arrière-plan de
l’intrigue en blanc, ggplot2
est livré avec plusieurs
autres thèmes qui peuvent être utiles pour changer rapidement
l’apparence de votre visualisation. La liste complète des thèmes est
disponible sur https://ggplot2.tidyverse.org/reference/ggtheme.html.
theme_minimal()
et theme_light()
sont
populaires, et theme_void()
peut être utile comme point de
départ pour créer un nouveau thème créé à la main.
Le package ggthemes
fournit une grande variété d’options (y compris un thème Excel 2003 ).
The ggplot2 provides a list of packages that extend the capabilities of
ggplot2
, including additional themes.
Personnalisation
Revenons à l’intrigue à facettes de l’expression moyenne par temps et gène, colorée par sexe.
Jetez un œil à la feuille de triche , et réfléchissez aux moyens vous pourriez améliorer l’intrigue.
Maintenant, nous pouvons changer les noms des axes en quelque chose de plus informatif que ‘time’ et ‘mean_exp’, et ajouter un titre à la figure :
R
ggplot(data = moyenne_exp_by_time_sex,
mapping = aes(x = temps, y = moyenne_exp, couleur = sexe)) +
geom_line() +
facet_wrap(~ gène, échelles = "free_y") +
theme_bw() +
theme(panel.grid = element_blank()) +
labs(title = "Expression moyenne des gènes selon la durée de l'infection",
x = "Durée de l'infection (en jours)",
y = "Expression moyenne des gènes")
ERREUR
Error in ggplot(data = moyenne_exp_by_time_sex, mapping = aes(x = temps, : could not find function "ggplot"
Les axes ont des noms plus informatifs, mais leur lisibilité peut être améliorée en augmentant la taille de la police :
R
ggplot(data = moyenne_exp_by_time_sex,
mapping = aes(x = temps, y = moyenne_exp, couleur = sexe)) +
geom_line() +
facet_wrap(~ gène, échelles = "free_y") +
theme_bw() +
theme(panel.grid = element_blank()) +
labs(title = "Expression moyenne des gènes selon la durée de l'infection",
x = "Durée de l'infection (en jours)",
y = "Expression génétique moyenne") +
theme(text = element_text(size = 16))
ERREUR
Error in ggplot(data = moyenne_exp_by_time_sex, mapping = aes(x = temps, : could not find function "ggplot"
Notez qu’il est également possible de changer les polices de vos
tracés. Si vous êtes sous Windows, vous devrez peut-être installer le extrafont
package.
Nous pouvons personnaliser davantage la couleur du texte des axes x
et y, la couleur de la grille, etc. Nous pouvons aussi par exemple
déplacer la légende vers le haut en définissant
legend.position
sur "top"
.
R
ggplot(data = mean_exp_by_time_sex,
mapping = aes(x = time, y = mean_exp, color = sex)) +
geom_line() +
facet_wrap(~ gene, scales = "free_y") +
theme_bw() +
theme(panel.grid = element_blank()) +
labs(title = "Mean gene expression by duration of the infection",
x = "Duration of the infection (in days)",
y = "Mean gene expression") +
theme(text = element_text(size = 16),
axis.text.x = element_text(colour = "royalblue4", size = 12),
axis.text.y = element_text(colour = "royalblue4", size = 12),
panel.grid = element_line(colour="lightsteelblue1"),
legend.position = "top")
ERREUR
Error in ggplot(data = mean_exp_by_time_sex, mapping = aes(x = time, y = mean_exp, : could not find function "ggplot"
Si vous préférez les modifications que vous avez créées au thème par défaut, vous pouvez les enregistrer en tant qu’objet pour pouvoir les appliquer facilement à d’autres tracés que vous pourriez créer. Voici un exemple avec l’histogramme que nous avons créé précédemment.
R
blue_theme <- theme(axis.text.x = element_text(colour = "royalblue4",
size = 12),
axis.text.y = element_text(colour = "royalblue4",
size = 12),
text = element_text(size = 16),
panel.grid = element_line(colour="lightsteelblue1"))
ERREUR
Error in theme(axis.text.x = element_text(colour = "royalblue4", size = 12), : could not find function "theme"
R
ggplot(rna, aes(x = expression_log)) +
geom_histogram(bins = 20) +
blue_theme
ERREUR
Error in ggplot(rna, aes(x = expression_log)): could not find function "ggplot"
Défi
Avec toutes ces informations en main, veuillez prendre encore cinq minutes pour soit améliorer l’un des tracés générés dans cet exercice, soit créer votre propre graphique. Utilisez la feuille de triche RStudio ggplot2 pour vous inspirer. Voici quelques idées :
- Voyez si vous pouvez modifier l’épaisseur des lignes.
- Pouvez-vous trouver un moyen de changer le nom de la légende ? Qu’en
est-il de ses étiquettes ? (indice : recherchez une fonction ggplot
commençant par
scale_
) - Essayez d’utiliser une palette de couleurs différente ou de spécifier manuellement les couleurs pour les lignes (voir http://www.cookbook-r.com/Graphs/Colors_(ggplot2)/).
Par exemple, sur la base de ce tracé :
R
ggplot(data = moyenne_exp_by_time_sex,
mapping = aes(x = temps, y = moyenne_exp, couleur = sexe)) +
geom_line() +
facet_wrap(~ gène, échelles = "free_y") +
theme_bw() +
theme(panel.grid = element_blank())
ERREUR
Error in ggplot(data = moyenne_exp_by_time_sex, mapping = aes(x = temps, : could not find function "ggplot"
Nous pouvons le personnaliser des manières suivantes :
R
# change the thickness of the lines
ggplot(data = mean_exp_by_time_sex,
mapping = aes(x = time, y = mean_exp, color = sex)) +
geom_line(size=1.5) +
facet_wrap(~ gene, scales = "free_y") +
theme_bw() +
theme(panel.grid = element_blank())
ERREUR
Error in ggplot(data = mean_exp_by_time_sex, mapping = aes(x = time, y = mean_exp, : could not find function "ggplot"
R
# change the name of the legend and the labels
ggplot(data = mean_exp_by_time_sex,
mapping = aes(x = time, y = mean_exp, color = sex)) +
geom_line() +
facet_wrap(~ gene, scales = "free_y") +
theme_bw() +
theme(panel.grid = element_blank()) +
scale_color_discrete(name = "Gender", labels = c("F", "M"))
ERREUR
Error in ggplot(data = mean_exp_by_time_sex, mapping = aes(x = time, y = mean_exp, : could not find function "ggplot"
R
# using a different color palette
ggplot(data = mean_exp_by_time_sex,
mapping = aes(x = time, y = mean_exp, color = sex)) +
geom_line() +
facet_wrap(~ gene, scales = "free_y") +
theme_bw() +
theme(panel.grid = element_blank()) +
scale_color_brewer(name = "Gender", labels = c("F", "M"), palette = "Dark2")
ERREUR
Error in ggplot(data = mean_exp_by_time_sex, mapping = aes(x = time, y = mean_exp, : could not find function "ggplot"
R
# manually specifying the colors
ggplot(data = mean_exp_by_time_sex,
mapping = aes(x = time, y = mean_exp, color = sex)) +
geom_line() +
facet_wrap(~ gene, scales = "free_y") +
theme_bw() +
theme(panel.grid = element_blank()) +
scale_color_manual(name = "Gender", labels = c("F", "M"),
values = c("royalblue", "deeppink"))
ERREUR
Error in ggplot(data = mean_exp_by_time_sex, mapping = aes(x = time, y = mean_exp, : could not find function "ggplot"
Composer des intrigues
Faceting is a great tool for splitting one plot into multiple subplots, but sometimes you may want to produce a single figure that contains multiple independent plots, i.e. plots that are based on different variables or even different data frames.
Commençons par créer les deux tracés que nous souhaitons disposer l’un à côté de l’autre :
Le premier graphique compte le nombre de gènes uniques par
chromosome. Nous devons d’abord réorganiser les niveaux de
chromosome_name
et filtrer les gènes uniques par
chromosome. Nous modifions également l’échelle de l’axe y en une échelle
log10 pour une meilleure lisibilité.
R
arn$chromosome_name <- factor(rna$chromosome_name,
niveaux = c(1:19,"X","Y"))
ERREUR
Error in factor(rna$chromosome_name, niveaux = c(1:19, "X", "Y")): unused argument (niveaux = c(1:19, "X", "Y"))
R
count_gene_chromosome <- rna %> % select(chromosome_name, gene) %>%
distinct() %>% ggplot() +
geom_bar(aes(x = chromosome_name), fill = "seagreen",
position = "esquive", stat = "count") +
labs(y = "log10(n gènes)", x = "chromosome") +
scale_y_log10()
ERREUR
Error in rna %> % select(chromosome_name, gene) %>% distinct() %>% ggplot(): could not find function "%>%"
R
count_gene_chromosome
ERREUR
Error in eval(expr, envir, enclos): object 'count_gene_chromosome' not found
Ci-dessous, nous supprimons également complètement la légende en
définissant legend.position
sur "none"
.
R
exp_boxplot_sex <- ggplot(rna, aes(y=expression_log, x = as.factor(time),
color=sex)) +
geom_boxplot(alpha = 0) +
labs(y = "Exp moyenne du gène",
x = "time") + theme(legend.position = "none")
ERREUR
Error in ggplot(rna, aes(y = expression_log, x = as.factor(time), color = sex)): could not find function "ggplot"
R
exp_boxplot_sex
ERREUR
Error in eval(expr, envir, enclos): object 'exp_boxplot_sex' not found
Le package patchwork
fournit une approche élégante pour combiner des figures en utilisant le
« + » pour disposer les figures (généralement latérales). de côté). Plus
précisément, le |
les dispose explicitement côte à côte et
/
les empile les uns sur les autres .
R
install.packages("patchwork")
R
library("patchwork")
ERREUR
Error in library("patchwork"): there is no package called 'patchwork'
R
count_gene_chromosome + exp_boxplot_sex
ERREUR
Error in eval(expr, envir, enclos): object 'count_gene_chromosome' not found
R
## ou count_gene_chromosome | exp_boxplot_sex
R
count_gene_chromosome / exp_boxplot_sex
ERREUR
Error in eval(expr, envir, enclos): object 'count_gene_chromosome' not found
Nous pouvons combiner un contrôle plus approfondi de la mise en page
de la composition finale avec plot_layout
pour créer des
mises en page plus complexes :
R
count_gene_chromosome + exp_boxplot_sex + plot_layout(ncol = 1)
ERREUR
Error in eval(expr, envir, enclos): object 'count_gene_chromosome' not found
R
count_gene_chromosome +
(count_gene_chromosome + exp_boxplot_sex) +
exp_boxplot_sex +
plot_layout(ncol = 1)
ERREUR
Error in eval(expr, envir, enclos): object 'count_gene_chromosome' not found
Le dernier tracé peut également être créé à l’aide des compositeurs
|
et /
:
R
count_gene_chromosome /
(count_gene_chromosome | exp_boxplot_sex) /
exp_boxplot_sex
ERREUR
Error in eval(expr, envir, enclos): object 'count_gene_chromosome' not found
Apprenez-en plus sur patchwork
sur sa page Web ou dans cette
vidéo.
Une autre option est le package
gridExtra
qui permet de combiner des
ggplots séparés en une seule figure en utilisant
grid.arrange()
:
R
install.packages("gridExtra")
R
library("gridExtra")
ERREUR
Error in library("gridExtra"): there is no package called 'gridExtra'
R
grid.arrange(count_gene_chromosome, exp_boxplot_sex, ncol = 2)
ERREUR
Error in grid.arrange(count_gene_chromosome, exp_boxplot_sex, ncol = 2): could not find function "grid.arrange"
En plus des arguments ncol
et nrow
,
utilisés pour créer des arrangements simples, il existe des outils pour
construire
des dispositions plus complexes.
Exporter des tracés
Après avoir créé votre tracé, vous pouvez l’enregistrer dans un fichier dans votre format préféré. L’onglet Exporter dans le volet Plot de RStudio enregistrera vos tracés à basse résolution, ce qui ne sera pas accepté par de nombreuses revues et ne s’adaptera pas bien aux affiches.
Utilisez plutôt la fonction ggsave()
, qui vous permet de
modifier facilement la dimension et la résolution de votre tracé en
ajustant les arguments appropriés (width
,
height
et dpi
).
Assurez-vous d’avoir le dossier fig_output/
dans votre
répertoire de travail.
R
my_plot <- ggplot(data = mean_exp_by_time_sex,
mapping = aes(x = time, y = mean_exp, color = sex)) +
geom_line() +
facet_wrap(~ gene, scales = "free_y") +
labs(title = "Mean gene expression by duration of the infection",
x = "Duration of the infection (in days)",
y = "Mean gene expression") +
guides(color=guide_legend(title="Gender")) +
theme_bw() +
theme(axis.text.x = element_text(colour = "royalblue4", size = 12),
axis.text.y = element_text(colour = "royalblue4", size = 12),
text = element_text(size = 16),
panel.grid = element_line(colour="lightsteelblue1"),
legend.position = "top")
ggsave("fig_output/mean_exp_by_time_sex.png", my_plot, width = 15,
height = 10)
# This also works for grid.arrange() plots
combo_plot <- grid.arrange(count_gene_chromosome, exp_boxplot_sex,
ncol = 2, widths = c(4, 6))
ggsave("fig_output/combo_plot_chromosome_sex.png", combo_plot,
width = 10, dpi = 300)
Remarque : Les paramètres « largeur » et « hauteur » déterminent également la taille de la police dans le tracé enregistré.
Autres packages pour la visualisation
ggplot2
est un package très puissant qui s’intègre très
bien dans notre pipeline tidy data et tidy tools. Il
existe d’autres packages de visualisation dans R qui ne doivent pas être
ignorés.
Graphiques de base
Le système graphique par défaut fourni avec R, souvent appelé
base R graphiques est simple et rapide. Il est basé sur le
*modèle de peintre ou de toile *, où différentes sorties sont
directement superposées les unes sur les autres (voir figure @ref(fig:paintermodel)). This is a fundamental
difference with ggplot2
(and with lattice
,
described below), that returns dedicated objects, that are rendered on
screen or in a file, and that can even be updated.
R
par(mfrow = c(1, 3))
plot(1:20, main = "Première couche, produite avec plot(1:20)")
plot(1:20, main = "Une ligne rouge horizontale, ajoutée avec abline(h = 10)")
abline(h = 10, col = "red")
plot(1:20, main = "Un rectangle , ajouté avec rect(5, 5, 15, 15)")
abline(h = 10, col = "red")
rect(5, 5, 15, 15, lwd = 3 )

Une autre différence principale est que la fonction de traçage des
graphiques de base essaie de faire la bonne chose en fonction
de leur type d’entrée, c’est-à-dire qu’ils adapteront leur comportement
en fonction de la classe de leur entrée. C’est encore une fois très
différent de ce que nous avons dans ggplot2
, qui n’accepte
que les trames de données en entrée, et qui nécessite que les tracés
soient construits petit à petit.
R
par(mfrow = c(2, 2))
boxplot(rnorm(100),
main = "Boxplot de rnorm(100)")
boxplot(matrix(rnorm( 100), ncol = 10),
main = "Boxplot de la matrice(rnorm(100), ncol = 10)")
hist(rnorm(100))
hist( matrice(rnorm(100), ncol = 10))
ERREUR
Error in matrice(rnorm(100), ncol = 10): could not find function "matrice"

L’approche prête à l’emploi dans les graphiques de base peut être
très efficace pour des figures simples et standards, qui peuvent être
produites très rapidement avec une une seule ligne de code et une seule
fonction telle que plot
, ou hist
, ou
boxplot
, … Les valeurs par défaut ne sont cependant pas
toujours les plus attractives et le réglage des figures, surtout
lorsqu’elles deviennent plus complexes (par exemple pour produire des
facettes), peut devenir long et fastidieux.
Le paquet treillis
Le package lattice
est similaire à
ggplot2
dans le sens où il utilise des trames de données en
entrée, renvoie des objets graphiques et prend en charge le facettage.
treillis
cependant n’est pas basé sur la grammaire des
graphiques et a une interface plus alambiquée.
Une bonne référence pour le package lattice
est @latticebook.