Manipulations de données avec le package dplyr
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 exemples sont celle du jeu de données iris. Il est constitué de quatre variables numériques “Sepal.Length”, “Sepal.Width”, “Petal.Length”, “Petal.Width”, et d’une variable catégorielle : “Species” (setosa/versicolor/virginica). Voici les six premières lignes de ce jeu de données :
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
1 La différence entre “colour” et “fill”
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é.
2 Les fonctions du package ggplot2
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 !
3. Modifier les couleurs des points en fonction d’une variable continue
Pour cela, on peut utiliser différentes sortes de gradient, qui correspondent à des fonctions différentes :
- scale_color_gradient : pour un gradient séquentiel simple
- scale_colour_gradient2 : pour un gradient divergent (une couleur forte qui se dégrade puis une autre couleur forte qui augmente)
- scale_colour_gradientn : pour des gradients avec plus de 2 couleurs
- scale_colour_continuous et scale_colour_viridis : pour utiliser des gradients prédéfinis.
3.1 Gradient séquentiel
ggplot(iris, aes(y=Sepal.Length, x=Sepal.Width))+ geom_point(aes(colour=Petal.Width))+ scale_color_gradient(low="blue", high="red")
3.2 Gradient divergent
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)
3.3 Gradient avec plus de 2 couleurs
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" )
3.4 Gradients prédéfinis
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”.
4 Modifier les couleurs des points en fonction d’une variable catégorielle :
Dans cette situation, les principales fonctions à utiliser sont :
- scale_colour_manual() : pour les définir manuellement
- scale_colour_brewer() : pour utiliser des palettes prédéfinies de type séquentiel, divergente, ou qualitative.
4.1 Définir manuellement
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”.
4.2 En utilisant une palette prédéfinie
Le package ggplot2 intègre des palettes prédéfinies, qui proviennent du package RColorBrewer.
4.2.1 Une palette séquentielle
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:
4.2.2 En utilisant une palette divergente
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 :
4.2.3 En utilisant une palette qualitative
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point(aes(colour=Species))+ scale_colour_brewer(palette = "PRGn")
Les palettes qualitatives disponibles sont:
5. Modifier les couleurs des barres ou des boites en fonction d’une variable catégorielle :
Cela se passe comme précédemment, en utilisant les fonctions “scale_fill_“, à la place de “scale_colour_”.
5.1 Modifier les couleurs manuellement :
ggplot(iris, aes(y=Sepal.Length, x=Sepal.Width))+ geom_boxplot(aes(fill=Species))+ scale_fill_manual(values=c("orange", "magenta", "blue"))
5.2 En utilisant une palette prédéfinie :
5.2.1 Palette séquentielle :
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_boxplot(aes(fill=Species))+ scale_fill_brewer(palette = "Greens")
5.2.2 Palette divergente
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_boxplot(aes(fill=Species))+ scale_fill_brewer(palette = "Spectral")
5.2.3 Palette qualitative
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_boxplot(aes(fill=Species))+ scale_fill_brewer(palette = "Accent")
6. Quelques fonctions utiles au sujet des couleurs
6.1 Obtenir les codes des couleurs utilisées par défaut par ggplot2
Pour cela, on utilise la fonction “show_col()“, du package “scales”:
library(scales) show_col(hue_pal()(3))
show_col(hue_pal()(5))
6.2 Obtenir les codes couleurs d’une palette prédéfinie
Par exemple ici les codes de 7 couleurs de la palette séquentielle Purples.
show_col(brewer_pal(palette = "Purples")(7))
7. Créer sa propre palette
7.1 Une palette de couleurs selon une charte graphique :
Pour cela, je vous renvoie sur l’excellent article de Simon Jackson :
Creating corporate colour palettes for ggplot2
7.2 Une palette de couleurs à partir d’une image
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"
8. Pour aller plus loin
- la vignette du package viridis
- la vignette du package “colorspace” qui permet de créer d’autres palettes.
Conclusion
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 🙏
👉 Cliquez ici pour soutenir le blog Statistiques et Logiciel R
Hello Claire,
Merci beaucoup pour tous tes articles qui me permettent de découvrir petit à petit l’univers du logiciel R. Merci infiniment.
Pourrais tu consacrer un article à la cartographie avec R? Merci d’avance.
Dio DEMBELE
Article très utile