Modifier les couleurs avec ggplot2

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 

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)) 
scatter plot de base

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))
 
couleur ggplot2 R

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)) 
couleurs boxplot ggplot2

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é.

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 !

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.

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") 
R ggplot2 couleur gradient

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) 
dégradé de couleurs

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"
    ) 

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") 
gradient 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”.

Modifier les couleurs des points en fonctiosn 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.

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")) 
couleur ggplot2

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”.

En utilisant une palette prédéfinie

Le package ggplot2 intègre des palettes prédéfinies, qui proviennent du package RColorBrewer.

Une palette séquentielle

ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) +
        geom_point(aes(colour=Species))+
        scale_colour_brewer(palette = "Greens") 
couleurs r ggplot2

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:

palette ggplot2

En utilisant une palette divergente

ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) +
        geom_point(aes(colour=Species))+
        scale_colour_brewer(palette = "PRGn") 
palette divergente
 

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 :

palette divergente ggplot2

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 sont : 

palette ggplot2

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_”.

ggplot(iris, aes(y=Sepal.Length, x=Sepal.Width))+
    geom_boxplot(aes(fill=Species))+
    scale_fill_manual(values=c("orange", "magenta", "blue")) 
couleurs boxplot

En utilisant une palette prédéfinie

Palette séquentielle

ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) +
        geom_boxplot(aes(fill=Species))+
        scale_fill_brewer(palette = "Greens") 
palette séquentielle boxplot

Palette divergente

ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) +
        geom_boxplot(aes(fill=Species))+
        scale_fill_brewer(palette = "Spectral") 
boxplot palette divergente

Palette qualitative

ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) +
        geom_boxplot(aes(fill=Species))+
        scale_fill_brewer(palette = "Accent") 
palette qualitative ggplot2

Quelques fonctions utiles au sujest de couleurs

Obtenir les codes des couleurs utilisées par défaut par ggplot2

Pour cela, on utilise la fonctionshow_col()“, du package “scales”:

library(scales) 
show_col(hue_pal()(3)) 
couleurs par défaut ggplot2
show_col(hue_pal()(5)) 
couleurs ggplot2 défaut

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)) 
code couleurs

Créer sa propre palette

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

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") 
couleurs ggplot2
##  [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" 

POur aller plus loin

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 🙏

Poursuivez votre lecture

create_palette(image_path = "img/Logo_blog_slr.jpg",
               number_of_colors =5,
               type_of_variable = "categorical") 
couleur ggplot2

Bonjour !

vous venez souvent ?

Identifiez-vous pour avoir accès à toutes les fontionnalités !

Aide mémoire off'R ;)

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.