Récemment, j’ai vu passer une question sur un forum dédié à R, qui m’a paru intéressante : une personne demandait comment réarranger un graphique réalisé avec ggplot2.
Cette question m’a inspiré cet article. Je vais donc vous montrer, en pas à pas, comment réarranger un graphique ggplot2, en modifiant l’ordre des modalités du facteur concerné.
Pour illustrer cet article, je vais employer le jeu de données `carsafety` contenu dans le package `UsingR`. Si vous voulez reproduire les exemples ci-dessous, il vous sera nécessaire d’installer au préalable, ce package `UsingR`, puis de le charger avec la commande `library(UsingR)`:
library(UsingR)
data(carsafety)
Le jeu de données `carsafety` concerne les statistiques de sécurité parues en janvier 2004 dans le New Yorker, montrant les taux de mortalité par million de véhicules, à la fois pour les conducteurs d’une voiture et les conducteurs d’autres voitures touchées.
Le jeu de donnéescarsafety
contient 4 variables :str(carsafety)
## 'data.frame': 33 obs. of 4 variables:
## $ Make.model : Factor w/ 33 levels "Buick Century",..: 29 7 30 33 14 23 16 6 1 27 ...
## $ type : Factor w/ 7 levels "SUV","compact",..: 3 5 4 7 5 4 4 5 4 2 ...
## $ Driver.deaths: num 40 31 41 47 37 53 54 51 70 74 ...
## $ Other.deaths : num 20 36 29 23 35 26 27 34 23 24 ...
Lorsque vous réalisez un plot avec ggplot2 et que l’une des variables est catégorielle, c’est-à-dire considérée par R, comme un facteur, l’ordre d’affichage est celui des modalités (ou niveaux de cette variable).
Pour connaître ces niveaux vous pouvez employer la fonction `levels()`. Par exemple, pour la variable `type` :
levels(carsafety$type)
## [1] "SUV" "compact" "large" "midsize" "minivan"
## [6] "pickup" "subcompact"
Remarque : lorsque vous importez un jeu de données avec une fonction read.csv2() ou autre, les levels par défaut sont ceux de l’ordre alphabétique. Ce n’est pas le cas, ici, ; les levels ont sans doute été modifiés lors de la création du jeu de données et de son inclusion dans le package UsingR
.
Si je réalise un barplot, pour représenter le nombre de données par type de véhicule, l’ordre des barres, va donc être : SUV, compact, large, midsize, minivan, pickup, subcompact :
library(ggplot2)
ggplot(carsafety, aes(x=type, fill=type))+
geom_bar(colour="black",show.legend = FALSE )+
theme_classic()
Pour changer l’ordre des barres, il faut changer l’ordre des levels !
Et il existe plusieurs fonctions super pratiques pour le faire, dans le package forcats
, qui appartient au super package tidyverse
:
Ce package forecats
dispose d’une feuille d’aide cheatsheet (dont est issue l’image précédente), que vous pouvez télécharger sur le site de R studio : https://rstudio.com/resources/cheatsheets/
La fonction la plus simple à employer est la fonction fct_relevel()
, l’ordre souhaité des modalités est alors spécifié manuellement. Par exemple pour réordonner les types de véhicule par ordre alphabétique :
library(forcats)
carsafety$type <- fct_relevel(carsafety$type, c("compact", "large", "midsize","minivan","pickup","subcompact", "SUV" ))
levels(carsafety$type)
## [1] "compact" "large" "midsize" "minivan" "pickup"
## [6] "subcompact" "SUV"
Si nous refaisons le graphique précédent :
ggplot(carsafety, aes(x=type, fill=type))+
geom_bar(colour="black",show.legend = FALSE )+
xlab("type")+
theme_classic()
Pour cela, nous employons la fonction fct_infreq
, comme ceci :
carsafety$type <- fct_infreq(carsafety$type)
levels(carsafety$type )
## [1] "midsize" "subcompact" "SUV" "compact" "large"
## [6] "minivan" "pickup"
ggplot(carsafety, aes(x=type, fill=type))+
geom_bar(colour="black",show.legend = FALSE )+
xlab("type")+
theme_classic()
Pour cela, nous allons employer, en amont, la fonction `fct_rev()`, c’est-à-dire : `fct_rev(fct_infreq(type)`
A ce stade, je précise que le changement d’ordre des modalités peut se faire directement au moment du plot. Vous n’êtes pas obligé de les modifier avant de faire le graphique :
ggplot(carsafety, aes(x=fct_rev(fct_infreq(type)), fill=type))+
geom_bar(colour="black",show.legend = FALSE )+
xlab("type")+
theme_classic()
Une autre possibilité est de présenter les données par ordre d’apparition dans le jeu de données. Par exemple, si je regarde la variable type
, je vois que l’ordre d’apparition des types de véhicule est : large, minivan, midsize, subcompact, compact, SUV et pickup:
carsafety$type[1:33]
[1] large minivan midsize subcompact
[5] minivan midsize midsize minivan
[9] midsize compact compact midsize
[13] SUV SUV subcompact subcompact
[17] SUV SUV midsize compact
[21] large subcompact SUV SUV
[25] midsize large SUV compact
[29] pickup subcompact subcompact subcompact
[33] pickup
En employant la fonction fct_inorder(type)
, je retrouve bien cet ordre :
Par exemple, si je fais un boxplot du nombre de conducteurs décédés, en fonction du type de véhicule, j’obtiens le graphique suivant :
ggplot(carsafety, aes(y=Driver.deaths, x=type, fill=type))+
geom_boxplot(colour="black" )+
geom_jitter()+
xlab("type")+
theme_classic()+
theme(legend.position="none")
Pour améliorer la visualisation, je peux souhaiter ordonner les types de véhicules en fonction de la valeur de la médiane. Cela se réalise très facilement, à l’aide de la fonction `fct_reorder()`, en indiquant en argument :
Au final, on emploiera fct_reorder(type,Driver.deaths,.fun="median")
, comme ceci :
ggplot(carsafety, aes(y=Driver.deaths, x=fct_rev(fct_reorder(type,Driver.deaths,.fun="median")), fill=type))+
geom_boxplot(colour="black" )+
geom_jitter()+
xlab("type")+
theme_classic()+
theme(legend.position="none")
Et on peut évidemment renverser cet ordre, en employant en amont la fonction fct_rev()
, comme ci-dessous :
ggplot(carsafety, aes(y=Driver.deaths, x=fct_rev(fct_reorder(type,Driver.deaths,.fun="median")), fill=type))+
geom_boxplot(colour="black" )+
geom_jitter()+
xlab("type")+
theme_classic()+
theme(legend.position="none")
Vous pouvez aussi employer les fonctions fct_relevel
, fct_infreq
, fct_inorder
, fct_rev
etc… en dehors des graphiques ggplot2, par exemple, pour modifier l’ordre d’affichage d’une table descriptive.
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 🙏
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.
15 Responses
Article très intéressant, comme toujours.
Pour ma part je ré-ordonne en amont de la création graphique via les fonctions de base
with()
etreorder()
. Exemple ci-dessous si l’on souhaite classer par ordre croissant une variable suivant les valeurs prises par celle-ci, sur un data.frame en format long.dat$variable <- with(dat, reorder(variable, value))
Cependant, il est toujours bon de connaître d’autre façons de procéder afin d’avoir plusieurs cordes à son arc. Merci pour l’article.
Bonjour Vincent,
merci pour le partage.
Bien à vous.
Bonjour Claire
Merci pour le partage. Sauf que moi je n’arrive pas à trouver la fonction « fct_infreq ». Elle est introuvable.
Bonjour,
la fonction fct_infreq appartient au package forcats, il faut l’installer au préalable, en utilisation l’outils d’installation de R Studio ou bien en utilisant la commande install.packages(« forcats »).
Bonne continuation.
C’est super
Quand est t-il a` propos du polygone statistique?
Si on a un nuage statistique, comment agrandir la taille d’écriture dans le titre et dans les axes, comment ajouter les dates sur l’axe des abscisses
Merci Mme Claire Della Vedova pour ce tutoriel
Bonjour Mohamed,
vous trouverez toutes les infos sur la modification des tailles des textes dans cet ouvrage , en consultation libre : https://r-graphics.org/
Bonne continuation.
Merci beaucoup
Bon article mais je n’arrive pas à télécharger le jeu des données : library(UsingR)
data(carsafety)
Bonjour Eric, il faut, au préalable, installer la library(UsingR).
Vous pouvez utiliser l’outil d’installation de R Studio, ou bien utiliser la commande : install.packages(« UsingR »)
Bonne continuation.
Super article!
Bonjour à tous ! vraiment je suis ravie d’avoir être parmi vous,en fait,je suis un étudiant de la biostatistique niveau licence3,et j’ai besoin plus des expériences, puisque pratiquement je suis nul.merci
Bonsoir, merci pour ce partage très utile.
Néanmoins, cela ne semble pas marcher pour un geom_treemap couplé à un facet_grid. Si vous avez une idée de la façon de procéder ?
Merci, bonne fin de journée.
Bonjour,
pour pouvoir vous aider il faudrait un exemple reproductible, là c’est un peu flou….
C’est un article très intéressant, je voyais facilement la manière d’ordonner les variables numériques avec la fonction reorder mais quant il s’agissait des variables catégorielles ça me compliquait, déjà cet article vient de combler mon insuffisance.
Merci beaucoup !
Bonjour, super article d’une grande aide dans l’apprentissage parfois complexe de R … Merci beaucoup !