Comment modifier l'ordre d'affichage d'un plot ?

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ées carsafety contient 4 variables :
  • `Make.model` : qui correspond au modèle du véhicule. Il s’agit d’une variable catégorielle, considérée par R comme un facteur, et qui contient 33 niveaux (ou modalités)
  • `type` : qui correspond au type du véhicule. Il s’agit d’une variable catégorielle, considérée par R comme un facteur, et qui contient 7 niveaux (ou modalités) : « SUV » , « compact », « large », « midsize », « minivan », ou « pickup ».
  •  `Driver.deaths`: qui correspond au nombre de conducteurs décédés. Il s’agit d’une variable numérique.
  • `Other.deaths`: qui correspond au nombre de conducteurs, d’autres voitures, décédés. Il s’agit également d’une variable numérique.
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 ... 

Modifier l'ordre d'un plot : partie théorique

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 :

fonction pour modifier l'ordre des levels

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/

Modifier l'ordre d'un plot : tutoriel

Modifier l'ordre manuellement

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

Modifier l'ordre en fonction du nombre croissant de données

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() 
par ordre croissant

Modifier l'ordre en fonction du nombre décroissant de données

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

Modifier l'ordre en fonction de l'ordre d'apparition

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 ordre d'apparition

Modifier l'ordre en fonction d'un paramètre statistique

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

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 :

  • la variable catégorielle concernée, ici `type`
  • la variable réponse concernée, ici `Driver.deaths`
  • le paramètre statistique, à l’aide de `.fun=`, ici « median »

 

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") 
ordre médianes décroissantes

Vous pouvez aussi employer les fonctions fct_relevelfct_infreqfct_inorderfct_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 🙏

15 Responses

  1. 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() et reorder(). 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.

  2. Bonjour Claire
    Merci pour le partage. Sauf que moi je n’arrive pas à trouver la fonction « fct_infreq ». Elle est introuvable.

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

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

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

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

  5. 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 !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

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.