Bienvenue
Un graphique linéaire représente une relation fonctionnelle entre deux variables continues. Une carte représente des données spatiales. Même si ces deux types de représentations semblent différents, ils sont fait de façon similaire. Dans ce module, vous allez apprendre à :
- Faire de nouveaux types de graphique avec
geom_step()
,geom_area()
,geom_path()
, etgeom_polygon()
- Eviter d’obtenir des graphiques en dents de scie avec le paramètre
esthétique
group
- Trouver et représenter des données spatiales avec
geom_map()
- Transformer un système de coordonnées en une projection de carte
avec
coord_map()
Ce module est adapté du livre R for Data Science d’Hadley Wickham et Garrett Grolemund, publié par O’Reilly Media, Inc., 2016, ISBN: 9781491910399. Vous pouvez obtenir le livre ici : shop.oreilly.com.
Ce module utilise les packages {ggplot2}, {maps}, {mapproj}, et {dplyr}, qui ont été chargés pour votre convenance.
Graphiques lineaires
Graphiques linéaires vs. Graphiques de dispersion
Comme les graphiques de dispersion (ou nuages de points), les graphiques linéaires représentent la relation entre deux variables continues. Cependant, contrairement aux nuages de points, les graphiques linéaires s’attendent à ce que les variables aient des relations fonctionnelles, avec chaque valeur de \(x\) associée à uniquement une valeur de \(y\).
Par exemple, dans le graphique ci-dessous, il n’y a qu’une valeur de
unemploy
pour chaque valeur de date
.
geom_line()
Utilisez la fonction geom_line()
pour créer des
graphiques linéaires. Comme geom_point()
,
geom_line()
a besoin d’un x et d’un y.
Utilisez geom_line()
dans le bloc pour recréer le
graphique ci-dessus. Le graphique utilise le jeu de données
economics
qui est dans {ggplot2}. Représentez la variable
date
sur l’axe des \(x\)
et unemploy
sur l’axe des \(y\). Allez voir le module Bases
de la visualisation de données si vous êtes complètement
bloqués.
ggplot(economics) +
aes(x = date, y = unemploy) +
geom_line()
asia
Nous avons utilisé le package {gapminder} pour créer
un nouveau jeu de données nommé asia
à représenter
graphiquement. asia
contient entre autres le PIB par
habitant (GDP per capita en anglais) de quatre pays entre 1952 et
2007.
asia
Phénomène de dents de scie
Cependant, lorsqu’on représente le jeu de données asia
,
le graphique semble bizarre. La ligne monte et descend en dents de scie
(on parle de whipsawing en anglais). Les graphiques en dents de
scie sont un des défis fréquents lorsqu’on réalise des graphiques
linéaires.
ggplot(asia) +
aes(x = year, y = gdpPercap) +
geom_line()
Quiz - Phénomène de dents de scie
Lignes multiples
Recréez le graphique en utilisant un nuage de points. Voyez-vous plus d’une “ligne” dans les données ?
ggplot(data = asia) +
aes(x = year, y = gdpPercap) +
geom_point()
group
De nombreuses fonctions géométriques geom
comme lines,
boxplots, et smooth lines, utilisent un objet unique pour le jeu de
données entier. Vous pouvez utiliser le paramètre esthétique
group pour indiquer à ces fonctions geom
de
représenter différents objets pour différents groupes
d’observations.
Par exemple, dans le code ci-dessous, vous pouvez associer
group
à la variable de regroupement country
pour créer une ligne distincte pour chaque pays. Essayez. Assurez-vous
de placer le groupe dans la fonction aes
.
ggplot(data = asia) +
aes(x = year, y = gdpPercap)
geom_line()
ggplot(data = asia) +
aes(x = year, y = gdpPercap, group = country) +
geom_line()
Paramètres esthétiques
Vous n’avez pas besoin de vous fier au paramètre esthétique
group
pour effectuer un regroupement. {ggplot2} regroupera
automatiquement un geom
chaque fois que vous ferez
correspondre un paramètre esthétique à une variable catégorielle.
Ainsi, par exemple, le code ci-dessous effectue un regroupement
implicite. Et comme nous utilisons le paramètre esthétique
color
, le tracé comprend la légende des couleurs.
ggplot(data = asia) +
aes(x = year, y = gdpPercap, color = country) +
geom_line()
linetype
Les lignes reconnaissent un paramètre esthétique que nous n’avons
jamais rencontré auparavant : linetype. Changez le paramètre
esthétique color
par le paramètre linetype
ci-dessous et examinez les résultats. Que se passe-t-il si vous associez
à la fois une couleur et un type de ligne à un pays ?
ggplot(data = asia) +
aes(x = year, y = gdpPercap, color = country) +
geom_line()
ggplot(data = asia) +
aes(x = year, y = gdpPercap, linetype = country, color = country) +
geom_line()
Exercice 1 - Espérance de vie
Utilisez ce que vous avez appris pour tracer l’espérance de vie de
chaque pays au fil du temps. L’espérance de vie est enregistrée dans le
jeu de données asia
dans la variable lifeExp
.
Quel pays a l’espérance de vie la plus élevée ? La plus faible ?
ggplot(data = asia) +
aes(x = year, y = lifeExp, color = country, linetype = country) +
geom_line()
Fonctions geometriques similaires
geom_step()
geom_step()
produit un graphique linéaire de manière
progressive. Pour voir ce que nous voulons dire, changez la fonction
geom
dans le graphique ci-dessous et relancez le code.
ggplot(data = asia) +
aes(x = year, y = lifeExp, color = country, linetype = country) +
geom_line()
ggplot(data = asia) +
aes(x = year, y = lifeExp, color = country, linetype = country) +
geom_step()
geom_area()
geom_area()
est similaire à un graphique linéaire, mais
il remplit la zone sous la ligne. Pour voir geom_area()
en
action, changez la fonction geom
dans le graphique
ci-dessous et relancez le code.
ggplot(data = economics) +
aes(x = date, y = unemploy) +
geom_line()
ggplot(data = economics) +
aes(x = date, y = unemploy) +
geom_area()
Révision - Paramètres esthétiques à l’intérieur ou à l’extérieur de
la fonction aes
Vous souvenez-vous du module Bases de la visualisation de données ? Comment feriez-vous pour mettre le remplissage de notre graphique en bleu (au lieu, par exemple, de faire correspondre le remplissage à une variable) ? Essayez.
ggplot(data = economics) +
aes(x = date, y = unemploy) +
geom_area()
ggplot(data = economics) +
aes(x = date, y = unemploy) +
geom_area(fill = "blue")
Accumulation
geom_area()
est un excellent choix si vos mesures
représentent l’accumulation d’objets (comme les personnes sans emploi).
Notez que l’axe \(y\) avec
geom_area()
commence ou se termine toujours à zéro.
C’est peut-être pour cette raison que geom_area()
peut
donner des résultats étranges lorsque vous avez plusieurs groupes.
Exécutez le code ci-dessous. Pouvez-vous dire ce qui se passe ici ?
ggplot(data = asia) +
aes(x = year, y = lifeExp, fill = country) +
geom_area()
Quiz - Ajustement de position
Si vous avez répondu que les Chinois vivaient jusqu’à 300 ans, vous avez mal deviné.
geom_area()
empile les groupes les uns au-dessus des
autres. Par conséquent, la ligne qui devrait afficher l’espérance de vie
pour la Chine affiche l’espérance de vie combinée pour tous les
pays.
Vous pouvez corriger cela en modifiant l’ajustement de position de la
fonction geom_area()
. Essayez ci-dessous. Changez le
paramètre de position de "stack"
(la valeur par défaut) à
"identity"
. Allez voir le module Diagramme à
barres si vous voulez en savoir plus sur les ajustements de
position.
ggplot(data = asia) +
aes(x = year, y = lifeExp, fill = country) +
geom_area(position = "stack", alpha = 0.3)
ggplot(data = asia) +
aes(x = year, y = lifeExp, fill = country) +
geom_area(position = "identity", alpha = 0.3)
geom_path()
geom_line()
a un drôle de collègue :
geom_path()
. geom_path()
trace une ligne entre
les points comme geom_line()
, mais au lieu de connecter les
points dans l’ordre où ils apparaissent le long de l’axe \(x\), cette fonction connecte les points
dans l’ordre où ils apparaissent dans le jeu de données.
Elle commence par l’observation de la première ligne du jeu de données et la relie à l’observation de la deuxième ligne, qu’elle relie ensuite à l’observation de la troisième ligne, et ainsi de suite.
Exemple geom_path()
Pour voir comment geom_path()
fait cela, réorganisons
les lignes du jeu de données economics
. Nous pouvons les
réarranger par valeur de la variable unemploy
. Ainsi, le
jeu données commencera par l’observation qui avait la valeur la plus
basse de unemploy
.
economics2 <- economics |>
arrange(unemploy)
economics2
Si nous traçons les données réordonnées avec à la fois
geom_line()
et geom_path()
nous obtenons deux
graphiques très différents.
ggplot(data = economics2) +
aes(x = date, y = unemploy) +
geom_line()
ggplot(data = economics2) +
aes(x = date, y = unemploy) +
geom_path()
Le graphique de gauche utilise geom_line()
: les points
sont reliés dans l’ordre le long de l’axe \(x\). Le graphique de droite utilise
geom_path()
: les points sont connectés dans l’ordre où ils
apparaissent dans le jeu de données (ce qui les met dans l’ordre le long
de l’axe \(y\)).
Un exemple d’utilisation
Pourquoi voudriez-vous utiliser geom_path()
? Le code
ci-dessous illustre un cas particulièrement utile. Le jeu de données
tx
contient des coordonnées de latitude et de longitude
sauvegardées dans un ordre spécifique.
tx
tx
Que pensez-vous qu’il se passe lorsque vous faites un graphique avec
les données de tx
? Exécutez le code pour le savoir.
ggplot(tx) +
aes(x = long, y = lat) +
geom_path()
ggplot(tx) +
aes(x = long, y = lat) +
geom_path()
geom_polygon()
geom_polygon()
va plus loin que geom_path()
: il relie le dernier point au premier, et colore ensuite la région
intérieure avec un remplissage. Le résultat est un polygone.
ggplot(tx) +
aes(x = long, y = lat) +
geom_polygon()
Exercice 2 - Phénomène de bris de verre
Selon vous, qu’est-ce qui a mal tourné dans le graphique du Texas ci-dessous ?
Cartes
{maps}
Le jeu de données tx
provient du package {maps}, qui est
un package R contenant des jeux de données au format similaire pour de
nombreuses régions du globe.
Une courte liste des jeux de données sauvegardés dans {maps} inclue :
france
, italy
, nz
,
usa
, world
, et world2
, ainsi que
county
et state
. Pour en savoir plus sur
{maps}, lancez help(package = maps)
.
map_data
Vous n’avez pas besoin d’accéder au package {maps} pour utiliser ses
données. {ggplot2} fournit la fonction map_data()
qui
récupère les cartes du package {maps} et les renvoie dans un format que
{ggplot2} peut tracer.
Syntaxe de map_data
Pour utiliser map_data()
, donnez-lui le nom d’un jeu de
données à récupérer. Vous pouvez récupérer un sous-ensemble de données
en renseignant l’argument optionnel region
. Par exemple,
nous pouvons utiliser ce code pour récupérer une carte de la Floride à
partir de state
, qui est le jeu de données qui contient les
50 états américains.
fl <- map_data("state", region = "florida")
ggplot(data = fl) +
aes(x = long, y = lat) +
geom_polygon()
Modifiez le code pour récupérer et tracer un autre état, par exemple l’Idaho.
id <- map_data("state", region = "idaho")
ggplot(data = id) +
aes(x = long, y = lat) +
geom_polygon()
state
Si vous ne spécifiez pas de région, map_data()
récupérera l’ensemble des données, dans ce cas state
.
us <- map_data("state")
En pratique, vous devrez souvent récupérer un jeu de données entier
au moins une fois pour savoir quels noms de régions il faut utiliser
avec map_data()
. Les noms seront stockés dans la colonne
region
de ce jeu de données.
Hmmm
Le code ci-dessous récupère et trace l’ensemble du jeu de données state, mais quelque chose ne va pas. Quoi ?
us <- map_data("state")
ggplot(data = us) +
aes(x = long, y = lat) +
geom_polygon()
Polygones multiples
Dans ce cas, notre jeu de données n’est pas désordonné, mais il contient plus d’un polygone : il contient 50 polygones - un pour chaque état.
Par défaut, geom_polygon()
essaie de tracer un seul
polygone, ce qui l’amène à relier plusieurs polygones de façon
étrange.
group
Quel paramètre pouvez-vous utiliser pour tracer des polygones
multiples ? Dans le code ci-dessous, associez le paramètre esthétique
group
à la variable group
du jeu de données
state
. Cette variable contient toutes les informations de
regroupement nécessaires pour réaliser une carte cohérente. Relancez
ensuite le code.
ggplot(data = us) +
aes(x = long, y = lat) +
geom_polygon()
ggplot(data = us) +
aes(x = long, y = lat, group = group) +
geom_polygon()
USArrests
R est fourni avec un jeu de données appelé USArrests
que
nous pouvons utiliser en conjonction avec notre graphique ci-dessus pour
faire une carte choroplèthe. Une carte choroplèthe utilise la
couleur de chaque région dans le graphique pour afficher une valeur
associée à la région.
Dans notre cas, nous utiliserons la variable UrbanPop
de
USAarrests
qui décrit le degré d’urbanisation de chaque
état en 1973. UrbanPop
est le pourcentage de la population
qui vivait à l’intérieur d’une ville.
USArrests
geom_map()
Vous pouvez utiliser geom_map()
pour créer des cartes
choroplèthes. geom_map()
couple des données comme
USArrests
avec une carte comme us
en faisant
correspondre les noms de régions.
Les conflits de données
Pour utiliser geom_map()
, nous devons d’abord nous
assurer qu’un ensemble commun de noms de régions apparaît dans les deux
ensembles de données.
Pour l’instant, ce n’est pas le cas. USArrests
utilise
des noms d’états en majuscules et les cache en dehors du jeu de données
dans les noms de lignes (plutôt que dans une colonne). Au contraire,
us
utilise une colonne de noms d’états en minuscules. Le
code ci-dessous permet de résoudre ce problème.
USArrests2 <- USArrests |>
rownames_to_column("region") |>
mutate(region = tolower(region))
USArrests2
Syntaxe de geom_map()
Pour utiliser geom_map()
:
Initialisez un graphique avec le jeu de données qui contient vos données. Ici,
USArrests2
.Ajouter
geom_map()
. Définissez le paramètre esthétiquemap_id
à la variable qui contient les noms des régions. Puis définissez le paramètre esthétiquefill
à la variablefill
. Vous n’avez pas besoin de fournir les paramètres esthétiquesx
ety
,geom_map()
dérivera ces valeurs de la carte, que vous devez définir avec le paramètremap
. Puisquemap
est un paramètre, il doit aller en dehors de la fonctionaes()
.Après
geom_map()
, utilisezexpand_limits()
, et dites àexpand_limits()
quelles sont les variables \(x\) et \(y\) dans la carte. Cela ne devrait pas être nécessaire dans les futures versions degeom_map()
, mais pour l’instant {ggplot2} utilisera les argumentsx
ety
deexpand_limits()
pour construire la boîte de délimitation de votre graphique.
ggplot(data = USArrests2) +
aes(map_id = region, fill = UrbanPop) +
geom_map(map = us) +
expand_limits(x = us$long, y = us$lat)
coord_map()
Vous avez peut-être remarqué que nos cartes ont l’air un peu fausses. Jusqu’à présent, nous les avons tracées en coordonnées cartésiennes, ce qui déforme la surface sphérique décrite par la latitude et la longitude. De plus, {ggplot2} ajuste le rapport d’aspect de nos graphiques pour qu’ils correspondent à notre fenêtre graphique, ce qui peut encore fausser nos cartes.
Vous pouvez éviter ces deux distorsions en ajoutant
coord_map()
à votre graphique. La fonction
coord_map()
affiche le graphique dans une projection
cartographique fixe. Notez que coord_map()
, repose sur le
package {mapproj} . Vous devrez donc avoir installé
{mapproj} avant d’utiliser coord_map()
.
ggplot(data = USArrests2) +
aes(map_id = region, fill = UrbanPop) +
geom_map(map = us) +
expand_limits(x = us$long, y = us$lat) +
coord_map()
Projections
Par défaut, coord_map()
remplace le système de
coordonnées par une projection Mercator. Pour utiliser une projection
différente, mettez l’argument projection
de
coord_map()
à un nom de projection, entouré de
guillemets.
Pour voir cela, étendez le code ci-dessous pour afficher la carte dans une projection “sinusoïdale”.
ggplot(data = USArrests2) +
aes(map_id = region, fill = UrbanPop) +
geom_map(map = us) +
expand_limits(x = us$long, y = us$lat)
ggplot(data = USArrests2) +
aes(map_id = region, fill = UrbanPop) +
geom_map(map = us) +
expand_limits(x = us$long, y = us$lat) +
coord_map(projection = "sinusoidal")
Récapitulatif
Vous pouvez maintenant réaliser tous les graphiques recommandés dans le module Analyse exploratoire de données. Le prochain module vous apprendra plusieurs stratégies pour faire face à la problématique de chevauchement (superposition), une problématique qui peut survenir lorsque vous avez de grands jeux de données ou des données à faible résolution.