Plusieurs objets géométriques (en anglais geoms) disposent de fonctions intégrées de transformations et de calculs statistiques. Dans plusieurs chapitres précédents, nous avons présenté geom_smooth(), qui calcule et visualise la relation entre x et y. La fonction geom_smooth() possède l'argument method, que l'on peut fixer à "loess" pour générer une courbe de régression flexible ou à "lm" pour générer une droite de régression linéaire. Le même principe s'applique à plusieurs autres geoms, ce qui signifie qu'ils effectuent des calculs pour visualiser les données.
Dans ce chapitre, nous utiliserons les données de gapminder pour montrer comment fonctionnent les transformations. Nous commençons par charger le package gapminder et par inspecter les 10 premières lignes. L'inspection des données peut se faire, entre autres, avec la fonction head().
library(gapminder)
head(gapminder, 10)| country <fctr> | continent <fctr> | year <int> | lifeExp <dbl> | pop <int> | gdpPercap <dbl> |
|---|---|---|---|---|---|
| Afghanistan | Asia | 1952 | 28.801 | 8425333 | 779.4453 |
| Afghanistan | Asia | 1957 | 30.332 | 9240934 | 820.8530 |
| Afghanistan | Asia | 1962 | 31.997 | 10267083 | 853.1007 |
| Afghanistan | Asia | 1967 | 34.020 | 11537966 | 836.1971 |
| Afghanistan | Asia | 1972 | 36.088 | 13079460 | 739.9811 |
| Afghanistan | Asia | 1977 | 38.438 | 14880372 | 786.1134 |
| Afghanistan | Asia | 1982 | 39.854 | 12881816 | 978.0114 |
| Afghanistan | Asia | 1987 | 40.822 | 13867957 | 852.3959 |
| Afghanistan | Asia | 1992 | 41.674 | 16317921 | 649.3414 |
| Afghanistan | Asia | 1997 | 41.763 | 22227415 | 635.3414 |
Nous construisons ensuite un diagramme en barres qui montre combien d'observations (lignes) il y a pour chaque continent. Cela se fait avec geom_bar(), qui crée un diagramme en barres. Le seul mappage esthétique que nous déclarons est x=continent. La fonction calculera automatiquement l'axe des y (le nombre de lignes pour chaque continent).
ggplot(data=gapminder) +
geom_bar(aes(x=continent))
Une alternative à ce qui précède consiste à calculer soi-même le nombre d'observations sur chaque continent. Cela se fait facilement avec la fonction count() du package dplyr. Vous avez probablement déjà chargé dplyr, puisqu'il fait partie du package tidyverse. Sinon, nous le chargeons maintenant :
library(tidyverse)La fonction count() compte le nombre de lignes pour une ou plusieurs variables catégorielles, de la manière suivante :
gapminder |>
count(continent)| continent <fctr> | n <int> |
|---|---|
| Africa | 624 |
| Americas | 300 |
| Asia | 396 |
| Europe | 360 |
| Oceania | 24 |
Comme on le voit ci-dessus, le nombre de lignes (n) est calculé pour chaque continent (continent).
Comme on le voit ci-dessus, le nombre de lignes (n) est calculé pour chaque continent (continent). Nous prenons maintenant ces données et créons un diagramme en barres identique au précédent. Comme geom_bar() ne doit plus calculer lui-même l'axe des y, nous indiquons y=n et nous utilisons l'argument stat="identity" pour signaler que les valeurs sont déjà calculées. Notez également que nous relions count() à ggplot() et utilisons ainsi directement le résultat de count() dans ggplot(). Cela est possible parce que le pipe (|>) transmet le résultat d'une opération à la fonction suivante, où ce résultat est utilisé comme premier argument (le premier argument de la fonction ggplot() est data).
gapminder |>
count(continent) |>
ggplot(aes(x=continent, y=n)) +
geom_bar(stat="identity")
D'autres transformations (calculs) sont intégrées aux objets géométriques. Vous avez déjà rencontré geom_smooth() dans le chapitre précédent. Voici d'autres exemples de geoms qui effectuent des calculs lorsqu'ils sont utilisés :
geom_bar(),geom_histogram(),geom_freqpoly()calculent des sommes et des proportions.geom_boxplot(),geom_violin()calculent des distributions.geom_smooth()crée un modèle de régression qui est visualisé.
Dans l'exemple suivant, nous utilisons gapminder pour faire ce qui suit :
- Ligne 2 : nous ne conservons que les pays d'Afrique en filtrant avec l'argument
continent=="Africa". - Ligne 2 : nous ne conservons que les données de l'année 1997 en filtrant avec l'argument
year==1997. - Ligne 2 : nous relions directement
ggplot()aux opérations précédentes avec|> - Ligne 4 : nous créons un diagramme en barres où le pays est l'axe des y et l'espérance de vie l'axe des x. Comme ces valeurs sont déjà calculées, l'argument
stat="identity"est utilisé :
gapminder |>
filter(continent=="Africa", year==1997) |>
ggplot()+
geom_bar(aes(y=country,
x=pop),
stat="identity")
Nous poursuivons en triant l'axe des y selon l'espérance de vie (lifeExp). Cela peut se faire directement dans aes() avec la fonction reorder(). Dans reorder, on précise ce qui doit être trié (country) et la colonne selon laquelle le tri doit être effectué (pop, c'est-à-dire la population). Voir la ligne 4 ci-dessous.
gapminder |>
filter(continent=="Africa", year==1997) |>
ggplot()+
geom_bar(aes(y=reorder(country, pop),
x=pop),
stat="identity")
Un signe moins (-) devant pop dans reorder() produit un tri inversé, comme suit (voir ligne 4) :
gapminder |>
filter(continent=="Africa", year==1997) |>
ggplot()+
geom_bar(aes(y=reorder(country, -pop),
x=pop),
stat="identity")
Nous devons également visualiser l'espérance de vie (lifeExp) de chaque pays, ce que nous pouvons faire avec l'argument fill(), de la manière suivante (ligne 6) :
gapminder |>
filter(continent=="Africa", year==1997) |>
ggplot()+
geom_bar(aes(y=reorder(country, pop),
x=pop,
fill=lifeExp),
stat="identity")
Proportions
Avec geom_bar(), on peut calculer des proportions (prop) au lieu d'effectifs (count). Cela se fait au moyen d'un « calcul a posteriori » (after_stat) sur y et en spécifiant group=1, ce qui signifie que la proportion totale sur l'ensemble des continents doit valoir 1 :
ggplot(data = gapminder) +
geom_bar(mapping = aes(x = continent,
y = after_stat(prop),
group = 1))
Stat summary : stat_summary()
Nous pouvons aussi utiliser stat_summary() pour choisir les paramètres à calculer et à visualiser. Avec stat_summary(), nous disposons d'une plus grande flexibilité quant aux calculs. Nous spécifions nous-mêmes les fonctions à utiliser et nous choisissons en outre le type de geom qui illustrera le résultat. Ci-dessous, nous utilisons stat_summary() pour calculer la moyenne, la valeur minimale et la valeur maximale de l'espérance de vie sur chaque continent, et le résultat est visualisé avec le geom « pointrange » (geom_pointrange()) :
## Nous utilisons uniquement les données de 1997
ggplot(data = filter(gapminder, year==1997)) +
stat_summary(
aes(x = continent,
y = lifeExp),
fun = mean,
fun.min = min,
fun.max = max,
geom = "pointrange"
)
Diagrammes en barres segmentés
Nous revenons aux données mpg pour illustrer d'autres fonctionnalités de geom_bar(). Dans l'exemple suivant, nous utilisons fill pour faire apparaître les parts d'une barre. Nous voulons faire apparaître les parts de la colonne drv (le type de transmission de la voiture) dans chaque barre. Dans le code ci-dessous, nous avons également ajusté le thème du graphique avec la fonction theme() afin d'incliner le texte de l'axe des x de 45° (les thèmes sont abordés dans un chapitre ultérieur).
mpg |>
ggplot(aes(x=manufacturer,
fill=drv)) +
geom_bar() +
# Incline le texte de l'axe des x de 45°
theme(axis.text.x = element_text(angle=45))
Il semble que le constructeur Volkswagen ne fabrique que des voitures à traction avant (f), tandis que Subaru ne fabrique que des voitures à quatre roues motrices. Land Rover ne fabrique que des voitures à propulsion arrière.
Dans l'exemple ci-dessus, nous avons écrit geom_gar() sans aucun argument. Cela signifie que position a pris sa valeur par défaut, qui est « identity ». Il existe aussi les options « dodge » et « fill », qui donnent les graphiques suivants :
mpg |>
ggplot(aes(x=manufacturer,
fill=drv)) +
geom_bar(position="dodge") +
theme(axis.text.x = element_text(angle=45))
Comme on le voit ci-dessus, position="dodge" place les segments côte à côte au lieu de les empiler les uns sur les autres. Nous poursuivons avec position="fill" :
mpg |>
ggplot(aes(x=manufacturer,
fill=drv)) +
geom_bar(position="fill") +
theme(axis.text.x = element_text(angle=45))
Comme on le voit ci-dessus, position="fill" présente les segments de chaque barre sous forme de parts (proportions) au lieu d'effectifs.