Quand on commence à utiliser le package ggplot2, la question de la gestion des couleurs se pose en général assez rapidement. Cet article a pour but de vous aider dans cette étape, en vous montrant quelques fonctions, outils, et autres ressources utiles.
Les données utilisées dans les
head(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
A mon sens, une des premières chose à bien comprendre est que ggplot2 utilise le terme “colour” (ou color d’ailleurs) pour tout ce qui concerne la couleur des points ou des lignes, et le terme “fill” pour tout ce qui concerne la couleur des boites (barplot, boxplot, etc…).
Par exemple, pour donner une couleur différente aux points, en fonction de leur appartenance à l’une des trois espèce d’iris (setosa/versicolor/virginica), il faut utiliser “colour=Species” en argument de la fonction de mappage “aes()” associée à la fonction “geom_point()”, comme ceci :
library(ggplot2)
ggplot(iris, aes(y=Sepal.Length, x=Sepal.Width))+
geom_point(aes(colour=Species))
De même, si l’on souhaite accorder les couleurs des points en fonction de la valeur d’une variable numérique (ici Petal.Width) :
ggplot(iris, aes(y=Sepal.Length, x=Sepal.Width))+
geom_point(aes(colour=Petal.Width))
En revanche, il est nécessaire d’utiliser “fill=Species” en argument de la fonction de mappage “aes()” lorsque la fonction est relative à une boite, comme ici avec geom_boxplot() :
ggplot(iris, aes(y=Sepal.Length, x=Sepal.Width))+
geom_boxplot(aes(fill=Species))
Remarque : on peut utiliser l’argument “aes(colour=Species))” en argument de la fonction gom_boxplot, mais dans ce cas-là, seul le contour des boites est modifié.
Il existe de nombreuse fonctions pour gérer les couleurs avec ggplot2. Cela peut être un peu intimidant au début, mais en réalité, il s’agit seulement de variantes.
Les fonctions qui permettent de gérer les couleurs des points et des lignes commencent par “scale_colour_“, et celles qui permettent de gérer les couleurs des boites commencent par “scale_fill_“.
Pour connaître toutes les fonctions disponibles, vous pouvez commencer à écrire, par exemple, “scale_colour” dans la console, puis appuyer sur Tab. Si vous utilisez la saisie automatique, la liste des fonctions apparaîtra automatiquement dans un fenêtre. La configuration de la saisie automatique est décrite dans cet article.
Vous pouvez également utiliser la commande ls(“package:ggplot2”).
ls("package:ggplot2")
En plus de cette distinction entre “colour” et “fill” , certaines fonctions s’appliquent lorsque la variable qui va service de base à la gestion des couleurs est de type catégorielle (cas du premier scaterplot du paragraphe 1 : la couleur est régie par la variable “Species”) ou numérique (cas du second scatterplot du paragraphe 1-la couleur est régie par la variable “Petal.Width”).
Si ça vous semble compliqué, pas de panique, on va voir cela avec des exemples !
Pour cela, on peut utiliser différentes sortes de gradient, qui correspondent à des fonctions différentes :
ggplot(iris, aes(y=Sepal.Length, x=Sepal.Width))+
geom_point(aes(colour=Petal.Width))+
scale_color_gradient(low="blue", high="red")
On peut aussi réaliser un gradient de couleurs en fixant la couleur médiane et son niveau. Par exemple ici, la couleur blanche à 1.3.
ggplot(iris, aes(y=Sepal.Length, x=Sepal.Width))+
geom_point(aes(colour=Petal.Width))+
scale_colour_gradient2(high="red", low="blue" , mid="white", midpoint=1.3)
Par exemple ici avec 5 couleurs :
ggplot(iris, aes(y=Sepal.Length, x=Sepal.Width))+
geom_point(aes(colour=Petal.Width))+
scale_colour_gradientn(
colours = c("blue", "green", "yellow", "orange", "red"),
limits = c(0.1, 2.5),
na.value = "transparent"
)
library(viridis)
ggplot(iris, aes(y=Sepal.Length, x=Sepal.Width))+
geom_point(aes(colour=Petal.Width))+
scale_colour_continuous(type = "viridis")
Pour utiliser la fonction “ scale_colour_viridis” il est nécessaire de charger le package “viridis”:
library(viridis)
ggplot(iris, aes(y=Sepal.Length, x=Sepal.Width))+
geom_point(aes(colour=Petal.Width))+
scale_colour_viridis(option="magma")
Les autres options possibles sont “inferno”, “plasma” et “cividis”.
Dans cette situation, les principales fonctions à utiliser sont :
Pour cela, on utilise la fonction “scale_colour_manual()” :
ggplot(iris, aes(y=Sepal.Length, x=Sepal.Width))+
geom_point(aes(colour=Species))+
scale_colour_manual(values=c("orange", "magenta", "black"))
Vous pouvez retrouver les noms des couleurs sur ce document et sur celui là.
Vous pouvez également choisir les couleurs en utilisant l’addin “colour picker”.
Le package ggplot2 intègre des palettes prédéfinies, qui proviennent du package RColorBrewer.
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) +
geom_point(aes(colour=Species))+
scale_colour_brewer(palette = "Greens")
Cela peut avoir un intérêt lorsque la variable qualitative est ordonnée comme “faible”, “moyen” et “fort”.
Les palettes séquentielles disponibles sont:
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) +
geom_point(aes(colour=Species))+
scale_colour_brewer(palette = "PRGn")
Cette palette peut être vraiment intéressante pour représenter les modalités d’une variable de statisfaction, par exemple “extrêmement satisfait” / “très satisfait” / “satisfait” / “moins satisfait” / “pas du tout satisfait”.
Les palettes divergentes disponibles dans ggplot2 sont :
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) +
geom_point(aes(colour=Species))+
scale_colour_brewer(palette = "PRGn")
Les palettes qualitatives sont :
Cela se passe comme précédemment, en utilisant les fonctions “scale_fill_“, à la place de “scale_colour_”.
ggplot(iris, aes(y=Sepal.Length, x=Sepal.Width))+
geom_boxplot(aes(fill=Species))+
scale_fill_manual(values=c("orange", "magenta", "blue"))
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) +
geom_boxplot(aes(fill=Species))+
scale_fill_brewer(palette = "Greens")
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) +
geom_boxplot(aes(fill=Species))+
scale_fill_brewer(palette = "Spectral")
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) +
geom_boxplot(aes(fill=Species))+
scale_fill_brewer(palette = "Accent")
Pour cela, on utilise la fonction “show_col()“, du package “scales”:
library(scales)
show_col(hue_pal()(3))
show_col(hue_pal()(5))
Par exemple ici les codes de 7 couleurs de la palette séquentielle Purples.
show_col(brewer_pal(palette = "Purples")(7))
Pour cela, je vous renvoie sur l’excellent article de Simon Jackson :
Creating corporate colour palettes for ggplot2
En utilisant le package “palleter”, il est possible de constituer une palette à partir des couleurs d’une image. Le package utilise un algorithme basé sur la méthode des kmeans.
library(devtools)
install_github("andreacirilloac/paletter")
Crédit photo : Garen
library(paletter)
set.seed(16)
create_palette(image_path = "img/tag.jpg",
number_of_colors =20,
type_of_variable = "categorical")
## [1] "#F36C5F" "#97261B" "#C05C4A" "#E19974" "#EB8C3F" "#EA8626" "#D38E4A"
## [8] "#A8996A" "#F0DC5D" "#FCE863" "#EFE696" "#CABC08" "#B2B352" "#B3DE3A"
## [15] "#8BEAF0" "#045991" "#837CCC" "#D15C92" "#D83E81" "#DF4983"
Vous trouverez plus d’infos sur le package palletter ici.
Remarque : cette fonction peut également être utilisée pour retrouver les codes couleurs d’une charte graphique :
create_palette(image_path = "img/Logo_blog_slr.jpg",
number_of_colors =5,
type_of_variable = "categorical")
## [1] "#309CD8" "#339AE3" "#E72080" "#F9197A" "#FA1577"
J’espère que cet article vous permettra de passer l’étape de la gestion des couleurs avec ggplot2 sans trop de difficultés.
Si cet article vous a plu, ou vous a été utile, et si vous le souhaitez, vous pouvez soutenir ce blog en faisant un don sur sa page Tipeee
create_palette(image_path = "img/Logo_blog_slr.jpg",
number_of_colors =5,
type_of_variable = "categorical")
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.