Lorsqu’on commence à employer le package ggplot2 pour visualiser des données, on a rapidement besoin de réaliser quelques mises en forme, comme par exemple modifier les couleurs, ajouter un titre, ajouter du texte, gérer la légende, assembler plusieurs graphiques, ou encore de les exporter.
Dans cet article, je vous propose d’explorer ces éléments.
La gestion des couleurs se fait en deux étapes :
Dans l’exemple ci-dessous, une couleur est appliquée en fonction de la variable Species
:
library(ggplot2)
ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
geom_point()
Pour modifier les couleurs par défaut, on utilisera la couche scale_colour_manual()
ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
geom_point()+
scale_colour_manual(values=c("orange", "blue", "green3"))
Vous pouvez préciser les couleurs en utilisant le code hexadécimal fournit par l’addin colour picker. Pour plus d’informations, consultez mon article : « Choisissez et modifiez très facilement les couleurs de vos graphs R avec Colour Picker« .
Si vous souhaitez appliquer une couleur en fonction d’une variable numérique, vous pouvez employer un gradient de couleurs, à l’aide de la couche, scale_coulour_gradient2()
:
library(scales)
ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Petal.Length))+
geom_point()+
scale_colour_gradient2(low = muted("red"), mid = "white", high = muted("blue"), midpoint =4.35 )
Remarque : pour utiliser la fonction muted()
, il est nécessaire de charger le package scales
.
l s’agit du même principe, sauf que l’on emploiera l’argument fill
dans la couche canevas, à la place de l’argument colour
, et ensuite les fonctions scale_fill_manual()
et scale_fill_gradient2()
, à la place des fonctions scale_colour_manual()
et scale_colour_gradient2()
ggplot(iris, aes(y=Sepal.Length, x=Species, fill=Species))+
geom_jitter()+
geom_boxplot(alpha=0.5)
ggplot(iris, aes(y=Sepal.Length, x=Species, fill=Species))+
geom_jitter()+
geom_boxplot(alpha=0.5)+
scale_fill_manual(values=c("orange", "blue", "green3"))
Nous pouvons facilement ajouter un titre, et un sous-titre en employant la fonction ggtitle()
.
ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
geom_point()+
scale_colour_manual(values=c("orange", "blue", "green3"))+
ggtitle("Longueur des Sépales en fonction de la largeur", subtitle="Par espèce")
La modification de l’alignement, de la taille et de la couleur du titre et du sous-titre se réalise dans une couche theme()
:
ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
geom_point()+
scale_colour_manual(values=c("orange", "blue", "green3"))+
ggtitle("Longueur des Sépales en fonction de la largeur", subtitle="Par espèce")+
theme(plot.title = element_text(hjust = 0.5,
size=12,
color="blue",
face="bold"),
plot.subtitle = element_text(hjust = 0.5,
size=10,
color="green3",
face="italic"))
Pour mettre une partie du texte à la ligne, il suffit d’introduire un `\n` dans la chaîne de caractères :
ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
geom_point()+
ggtitle("Longueur des Sépales \n en fonction de la largeur, \n par espèce")+
theme(plot.title = element_text(hjust = 0.5))
Les étiquettes des axes peuvent être définies à l’aide des couches `ylab` et `xlab` :
ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
geom_point()+
ylab("Longueur des sépales (cm)")+
xlab("Largeur des sépales (cm)")
La taille du quadrillage peut être géré avec les couches scale_x_continuous()
et scale_y_continuous()
et l’argument breaks
:
ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
geom_point()+
scale_x_continuous(breaks=seq(2,6,by=0.25))+
scale_y_continuous(breaks=seq(4,8,by=0.25))
Les étiquettes du quadrillage peuvent également être modifiées à l’aide de l’argument labels
des fonctions scale_y_continuous
et scale_x_continuous
. Par exemple, ci-dessous, pour exprimer la longueur des sépales en mm plutôt qu’en cm.
ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
geom_point()+
scale_y_continuous(breaks=seq(4,8,by=0.25), labels=seq(40,80,by=2.5))+
ylab("Longueur des Sépales en mm")
Certaines fois, pour plus de visibilité, nous pouvons avoir besoin d’appliquer une rotation des étiquettes sur l’axe des x. Cela peut se gérer au niveau de la couche theme()
et de l’élément axis.text.x
:
ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
geom_point()+
scale_x_continuous(breaks=seq(2,6,by=0.25))+
theme(axis.text.x=element_text(angle=30, hjust=1, vjust=1)
Pour augmenter rapidement la taille de l’étiquette des axes et du quadrillage (très utile pour l’exportation des plots), vous pouvez employer la fonction element_text(size=rel(2))
, comme ceci, par exemple :
ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
geom_point()+
scale_x_continuous(breaks=seq(2,6,by=0.25))+
theme (axis.title= element_text(size=rel(2)),
axis.text.x = element_text(size=rel(1.5)),
axis.text.y = element_text(size=rel(1.5)))
L‘affichage de la légende peut être géré dans les couches successives, ou de façon plus globale.
Dans le graphique ci-dessous, on peut voir, représenté dans la légende, une boite de boxplot et un point. Cela signifie que les deux couches sont concernées.
ggplot(iris,aes(x=Species, y=Sepal.Length, colour=Species))+
geom_jitter(width=0.25, height=0)+
geom_boxplot(alpha=0.25)
Nous allons pouvoir supprimer l’affichage de la légende à partir de la couche geom_jitter()
, en utilisant l’argument show.legend=FALSE
:
ggplot(iris,aes(x=Species, y=Sepal.Length, colour=Species))+
geom_jitter(width=0.25, height=0, show.legend=FALSE)+
geom_boxplot(alpha=0.25)
Idem avec la couche geom_boxplot():
ggplot(iris,aes(x=Species, y=Sepal.Length, colour=Species))+
geom_jitter(width=0.25, height=0, show.legend=FALSE)+
geom_boxplot(alpha=0.25,show.legend=FALSE)
Nous aurions pu obtenir le même résultat en utilisant la couche theme(legend.position="none")
:
ggplot(iris,aes(x=Species, y=Sepal.Length, colour=Species))+
geom_jitter(width=0.25, height=0)+
geom_boxplot(alpha=0.25) +
theme(legend.position="none")
Pour changer la position de la légende, nous pouvons employer les options left
, right
, bottom
, top
.
ggplot(iris,aes(x=Species, y=Sepal.Length, colour=Species))+
geom_jitter(width=0.25, height=0)+
geom_boxplot(alpha=0.25) +
theme(legend.position="bottom")
Le titre de la légende peut être modifié en utilisant la fonction labs()
. L’argument à employer (color
ou fill
), dépend de ce qui est employé dans la première couche. Dans l’exemple ci-dessous, on utilisera color
:
ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
geom_point()+
labs(color="Espèce")
Et dans ce second exemple, on utilisera fill
:
ggplot(iris,aes(x=Sepal.Width, fill=Species))+
geom_density()+
labs(fill="Espèce")
Il existe plusieurs solutions pour assembler plusieurs graphiques.
Une fonction simple à employer, est la fonction grid.arrange()
du package gridExtra
:
g1 <- ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
geom_point()+
labs(color="Espèce")
g2 <- ggplot(iris,aes(x=Sepal.Width, fill=Species))+
geom_density()+ labs(fill="Espèce")
library(gridExtra)
grid.arrange(g1,g2, ncol=2)
Pour des assemblages plus sophistiqués, vous pouvez employer la fonction plot_grid
du package cowplot
, ou encore le package patchwork
:
library(cowplot)
plot_grid(g1, g2, nrow=2, labels=c('A', 'B'),rel_heights = c(2, 4))
library(patchwork)
g1 + g2 +
plot_layout(nrow=2, height=c(2,1))
Pour ajouter une étiquette sur un point (par exemple un numéro d’identification), nous pouvons employer la fonction `geom_text()`, en définissant la variable concernée dans la fonction `aes()`.
Par exemple, si je créé, dans le jeu de données `iris`, une variable `id` avec le numéro de la ligne, je peux ensuite le faire figurer sur le graphique, comme ceci :
library(tidyverse)
iris <- iris %>%
mutate(id=1:nrow(iris)
ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
geom_point()+
geom_text(aes(label=id),size=3,check_overlap = TRUE, vjust=-1)
Pour ajouter du texte sur le graphique, nous pouvons employer la fonction annotate()
. Par exemple, si je délimite le graphique en 2 zones :
ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
geom_point()+
geom_vline(xintercept=3, col="magenta", size=2)+
annotate("text", x=2.5,y=4,label= "ZONE1", color="magenta")+
annotate("text", x=4,y=4,label= "ZONE2", color="magenta")
Une solution simple pour exporter un graphique, consiste à employer la fonction ggsave()
du package ggplot2
. Cette fonction permet alors de spécifier où le graphique doit être exporté, sous quel nom, quelle taille et avec quelle résolution(dpi).
Dans l’exemple ci dessous, je stock un graphique dans l’objet g3, puis je crée un dossier plot dans mon projet R, et enfin, j’exporte le graphique g3, dans le dossier plot, sous le nom « mon_super_plot.jpg », avec une dimension de 10 cm sur 10 cm et une résolution de 300 dpi.
# stockage du plot dans l'objet g3
g3 <- ggplot(iris,aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
geom_point()+
geom_vline(xintercept=3, col="magenta", size=2)+
annotate("text", x=2.5,y=4,label= "ZONE1", color="magenta")+
annotate("text", x=4,y=4,label= "ZONE2", color="magenta")
# creation du dossier plots
dir.create("plots")
# Exportation
ggsave(here::here("plots","mon_super_plot.jpg"),
g3,
width = 10,
height = 10,
units = "cm",
dpi=300)
J’espère que ce court post répondra à vos principaux besoins de mise en forme des graphiques. C’est à vous d’essayer, à présent !
Si cet article vous a plu ou vous a été utile, n’oubliez pas de le partager ! Vous pouvez également soutenir le blog par un don libre sur la page Tipeee.
Image par Clker-Free-Vector-Images de Pixabay
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.
8 Responses
Merci Claire pour cet article à nouveau très limpide et qui va encore bien nous aider!
Nathalie
Bonjour Madame Vedova,
Merci pour cet autre article très détaillé.
J’ai énormément apprécié.
Vivement un autre article.
Excellente journée à vous.
Bonjour Claire,
Je vous remercie énormément pour cet article si bien élaboré. Vous fournissez un travail très honorable. J’attends avec joie le prochain article. Excellente journée.
Super super cet article, merci Claire. Je l’adore.
Merci Claire, article très intéressant, ça m’a beaucoup aidé. Merci beaucoup
Bonjour Claire, mille mercis de me sauver encore une fois!
Bonjour Claire,
merci pour l’article fort intéressant. Je voudrais savoir comment réaliser un graphique en courbes avec des barres d’erreur. Par exemple après une ANOVA avec mesures répétées, je souhaite comparer mes objets avec des courbes tout en montrant l’évaluation de la variable mesurée dans le temps.
Merci
Bonjour,
regardez du côté de la fonction emmip() du package emmeans.
Bonne continuation.