Graphiques linéaires et cartes

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(), et geom_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(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(asia) +
  aes(x = year, y = gdpPercap)
  geom_line()
ggplot(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(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(asia) +
  aes(x = year, y = gdpPercap, color = country) +
  geom_line()
ggplot(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(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(asia) +
  aes(x = year, y = lifeExp, color = country, linetype = country) +
  geom_line()
ggplot(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(economics) +
  aes(x = date, y = unemploy) +
  geom_line()
ggplot(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(economics) +
  aes(x = date, y = unemploy) +
  geom_area()
ggplot(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(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(asia) +
  aes(x = year, y = lifeExp, fill = country) +
  geom_area(position = "stack", alpha = 0.3)
ggplot(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(economics2) +
  aes(x = date, y = unemploy) +
  geom_line()

ggplot(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(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(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(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(us) +
  aes(x = long, y = lat) +
  geom_polygon()
ggplot(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() :

  1. Initialisez un graphique avec le jeu de données qui contient vos données. Ici, USArrests2.

  2. Ajouter geom_map(). Définissez le paramètre esthétique map_id à la variable qui contient les noms des régions. Puis définissez le paramètre esthétique fill à la variable fill. Vous n’avez pas besoin de fournir les paramètres esthétiques x et y, geom_map() dérivera ces valeurs de la carte, que vous devez définir avec le paramètre map. Puisque map est un paramètre, il doit aller en dehors de la fonction aes().

  3. Après geom_map(), utilisez expand_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 de geom_map(), mais pour l’instant {ggplot2} utilisera les arguments x et y de expand_limits() pour construire la boîte de délimitation de votre graphique.

ggplot(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(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(USArrests2) +
  aes(map_id = region, fill = UrbanPop) +
  geom_map(map = us) +
  expand_limits(x = us$long, y = us$lat)
ggplot(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.