Une carte choroplèthe est une carte thématique dans laquelle les régions géographiques sont ombrées ou modélisées proportionnellement à la valeur d’une variable représentée. Cette variable peut être un indicateur épidémiologique tel que la prévalence ou le taux de mortalité d’une maladie. Les cartes choroplèthes sont particulièrement utiles pour visualiser les motifs spatiaux et les variations entre différentes régions.
Les composants essentiels d’une carte choroplèthe incluent :
Régions géographiques : Ce sont les zones qui seront représentées sur la carte, telles que les pays, les états, les districts ou d’autres divisions géographiques.
Valeurs des données : Ce sont les valeurs associées à chaque région géographique qui seront représentées sur la carte, y compris la densité de population, la prévalence, l’incidence, le taux de mortalité, etc.
Échelle de couleurs : C’est la gamme de couleurs utilisée pour représenter les différentes valeurs des données. Typiquement, un gradient de couleurs est utilisé, avec des couleurs plus claires représentant des valeurs inférieures et des couleurs plus foncées représentant des valeurs supérieures.
Les cartes choroplèthes offrent :
Cependant, elles présentent des défis :
Dans la section suivante, vous apprendrez à créer une carte choroplèthe en utilisant le package {ggplot2} dans R.
Cartes choroplèthes avec {ggplot2} :
ggplot()
et
geom_sf()
pour la visualisation des cartes.Appariement des données avec des polygones :
Obtenir des limites et des données liées aux maladies.
Combiner les données en fonction des niveaux administratifs.
Techniques d’échelle de couleurs :
Facettes pour la visualisation des cartes :
facet_wrap()
et facet_grid()
pour
créer des petites cartes multiples.Ce morceau de code ci-dessous montre comment charger les paquets
nécessaires en utilisant p_load()
du package {pacman}.
S’ils ne sont pas installés, il installe le paquet avant de le
charger.
# Charger les paquets nécessaires
# Utiliser pacman pour charger plusieurs paquets ; il les installera s'ils ne sont pas déjà installés
pacman::p_load(tidyverse, # pour la manipulation et la visualisation des données
here, # pour les chemins de fichiers relatifs au projet
sf) # pour les données spatiales
# Désactiver la notation scientifique pour des affichages numériques plus clairs
options(scipen=10000)
Avant de créer une carte choroplèthe, il est essentiel de préparer les données. Les données doivent contenir les régions géographiques et les valeurs que vous souhaitez visualiser.
Dans cette section, vous passerez en revue le processus de préparation des données, qui comprend les étapes suivantes :
Importer les données de polygones : Il s’agit des données géographiques contenant les limites de chaque région que vous souhaitez inclure dans votre carte.
Importer les données attributaires : Il s’agit des données contenant les valeurs que vous souhaitez visualiser sur la carte, telles que la prévalence de la maladie, la densité de population, etc.
Joindre les données de polygones et les données attributaires : Cette étape implique de fusionner les données de polyg
ones avec les données attributaires en fonction d’un identifiant commun, tel que le niveau administratif ou le nom de la région. Cela créera un ensemble de données unique contenant à la fois les limites géographiques et les valeurs de données correspondantes.
Maintenant, passons en détail à chaque étape !
Les polygones sont des formes fermées avec trois côtés ou plus. Dans les données spatiales, les polygones sont utilisés pour représenter des zones telles que la limite d’une ville, d’un lac ou de tout type d’utilisation des terres. Ils sont essentiels dans les systèmes d’information géographique (SIG) pour des tâches telles que la cartographie, l’analyse spatiale et la classification de l’occupation des terres.
Les fichiers de formes (shapefiles) sont un format courant pour stocker des données spatiales. Ils se composent d’au moins trois fichiers avec des extensions .shp (forme), .shx (index) et .dbf (données attributaires).
Dans R, vous pouvez charger des fichiers de formes en utilisant le
package sf
. Dans notre leçon d’aujourd’hui, nous
travaillerons avec des données sur le paludisme provenant de la revue
Epi du Nigeria (2022).
# Lecture du fichier de formes
nga_adm1 <-
sf::st_read(here::here("data/raw/NGA_adm_shapefile/NGA_adm1.shp"))
## Reading layer `NGA_adm1' from data source
## `C:\Users\joych\epi_reports_staging\EPIREP_FR_choropleth_maps\data\raw\NGA_adm_shapefile\NGA_adm1.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 38 features and 9 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 2.668431 ymin: 4.270418 xmax: 14.67642 ymax: 13.89201
## Geodetic CRS: WGS 84
Les éléments importants de toute couche ggplot sont les mappings
esthétiques aes(x,y, …)
qui indiquent à ggplot où placer
les objets graphiques.
Nous pouvons imaginer une carte comme un graphique avec toutes les
fonctionnalités mappées sur un axe x et y. Tous les types de géométrie
(geom_
) dans ggplot comportent une sorte de mapping
esthétique, et ceux-ci peuvent être déclarés au niveau du graphique, par
exemple, ggplot(data, aes(x = variable1, y = variable2))
,
ou au niveau de chaque couche individuelle, par exemple,
geom_point(aes(color = variable3))
.
Ci-dessous, vous pouvez voir que geom_sf()
est utilisé
pour tracer les limites des différents états du Nigeria. De même,
différentes couches peuvent être ajoutées par-dessus.
Ici, nous lisons d’abord le fichier de formes du Nigeria en utilisant
sf::st_read()
puis nous le traçons en utilisant
ggplot
. La fonction geom_sf()
est utilisée
pour rendre les données spatiales, et labs()
est utilisé
pour ajouter un titre au graphique.
Comme le fichier de formes a été chargé en utilisant
sf::st_read()
, nous n’avons pas besoin de spécifier les
noms des axes. En fait, les coordonnées sont stockées comme un objet
multipolygone dans la variable géométrie, et geom_sf()
les
reconnaît automatiquement.
Pour les utilisateurs intéressés par l’accès aux données de limites infranationales dans R, il existe plusieurs packages disponibles sur GitHub qui facilitent ce processus :
Le {rgeoboundaries} (https://github.com/wmgeolab/rgeoboundaries) récupère des données de Geoboundaries, une base de données ouverte de limites administratives politiques.
Le {rnaturalearth} (https://github.com/ropensci/rnaturalearth) récupère des données de Natural Earth, un ensemble de données cartographiques du domaine public.
Dans le contexte des cartes choroplèthes, les “données d’attribut” font référence aux informations quantitatives ou qualitatives qui seront utilisées pour colorer ou nuancer les différentes zones géographiques sur la carte. Par exemple, si vous avez une carte des régions d’un pays et souhaitez colorer chaque région en fonction de sa population, les données sur la population seraient considérées comme des données d’attribut.
Comme souligné ci-dessus, nous utiliserons le nombre de cas de paludisme signalés au Nigeria pour les années 2000, 2006, 2010, 2015 et 2021.
Il est essentiel de vérifier et de valider les données jointes pour s’assurer que la fusion sera réussie et que les données seront exactes.
## [1] "Lengths (38, 37) differ (string compare on first 37)"
## [2] "2 string mismatches"
## [1] "Water body"
Dans l’extrait de code fourni, nous comparons les noms de régions
uniques entre les ensembles de données nga_adm1
et
malaria_cases
en utilisant la fonction
all.equal()
. Ceci afin de s’assurer que toutes les régions
du fichier de formes correspondent à leurs homologues dans les données
d’attribut.
Si les noms de régions sont identiques, all.equal()
renverra TRUE.
Cependant, s’il y a des divergences, elle
détaillera les différences entre les deux ensembles de noms de
régions.
Il est noté que le “Plan d’eau” est présent dans le fichier de formes
mais pas dans le malaria_cases
. Comme “Plan d’eau” n’est
pas une région propre, il devrait être retiré avant de joindre les
ensembles de données. Nous pouvons le faire avec
filter()
.
Nous allons maintenant obtenir les données que nous voulons tracer sur la carte. L’important est que les noms des régions soient les mêmes dans le fichier de formes que dans vos données que vous souhaitez tracer, car cela sera nécessaire pour qu’ils fusionnent correctement.
Avant de joindre les deux ensembles de données, nous devons définir
la clé de jointure (by =
).
N’oubliez pas de revoir la leçon sur la jointure des tables pour plus de détails sur la façon de fusionner les data.frames dans R si vous n’êtes pas familier avec la jointure.
# Ajouter les données de population et calculer les cas pour 10K de population
malaria <- malaria_cases %>%
left_join(nga_adm1,
by = c("state_name" = "NAME_1")) %>%
st_as_sf() # convertir en fichier de formes
# Sélectionner les colonnes les plus importantes
malaria2 <- malaria%>%
select(state_name, cases_2000, cases_2006, cases_2010, cases_2015, cases_2021, geometry)
Dans cette étape, nous fusionnons les données du fichier de formes
nga_adm1
avec les données malaria_cases
en
utilisant left_join()
du package {dplyr}. L’argument
by
est utilisé pour spécifier la colonne commune sur
laquelle fusionner les ensembles de données.
Enfin, nous convertissons les données fusionnées en un fichier de
formes en utilisant st_as_sf()
.
Nous pouvons conserver uniquement les variables importantes qui
seront utilisées dans la construction des tracés en utilisant
select()
.
Dans cette partie de la leçon, nous avons appris l’importance des niveaux administratifs dans les données spatiales et
comment joindre les données spatiales et d’attribut par niveaux administratifs en utilisant le package {dplyr} dans R et comment vérifier et valider les données jointes.
Pour afficher le nombre de cas, par exemple pour 2021, nous devons
remplir les polygones tracés avec geom_sf()
en utilisant la
variable fill
. Cela est très simple car cela suit la même
logique que la syntaxe du package {ggplot2}.
ggplot(data=malaria2) +
geom_sf(aes(fill=cases_2021)) + # régler le remplissage pour varier selon la variable de nombre de cas
labs(title = "Cas de Paludisme Répartis au Nigeria") +
theme_void()
Nous créons une carte choroplèthe de base en utilisant {ggplot2}.
L’esthétique fill
est réglée pour varier selon la variable
cases
, ce qui colore les régions en fonction du nombre de
cas de paludisme.
Nous pouvons personnaliser la carte en ajoutant des titres aux axes
et à la légende, en ajoutant une flèche du nord et une barre d’échelle
avec ggspatial::annotation_north_arrow()
et
ggspatial::annotation_scale()
, et en changeant le thème
pour theme_bw()
.
ggplot(data=malaria2) +
geom_sf(aes(fill=cases_2021)) + # régler le remplissage pour varier selon la variable de nombre de cas
labs(title = "Cas de Paludisme Répartis au Nigeria (2021)",
fill = "Nombre de Cas") +
xlab("Longitude")+
ylab("Latitude")+
ggspatial::annotation_north_arrow(location = "br")+
ggspatial::annotation_scale(location = "tr")+
theme_bw()
Dans cette section, nous avons d’abord créé une carte choroplèthe de base en utilisant {ggplot2} pour visualiser les cas régionaux de paludisme au Nigeria pour 2021. Ensuite, nous avons amélioré la carte en ajoutant des titres, des étiquettes d’axes, une flèche du nord, une barre d’échelle et en appliquant un thème monochrome.
Q : Construisez votre magnifique carte choroplèthe
Construisez une carte choroplèthe pour afficher la distribution des
cas de paludisme en 2015, en utilisant la colonne
cases_2015
du jeu de données malaria2
. Vous
pouvez améliorer la conception et la clarté de votre carte en intégrant
des titres, des étiquettes d’axes et toute autre étiquette
pertinente.
La fonction scale_fill_continuous()
du package {ggplot2}
dans R est utilisée pour appliquer une échelle de couleurs continue à
une carte choroplèthe.
Nous pouvons personnaliser la palette de couleurs utilisée pour
l’échelle de couleurs continue en spécifiant les paramètres
low
et high
dans la fonction
scale_fill_continuous()
.
# Créer un objet ggplot
ggplot(data = malaria2) +
geom_sf(aes(fill = cases_2021)) +
scale_fill_continuous(low = "yellow", high = "red", name = "Cas") + # appliquer une échelle de couleurs continue
ggtitle("Répartition des Cas de Paludisme par Région en 2021") + # Ajouter le titre corrigé ici
theme_bw()
Dans cette section, nous avons appris comment appliquer une échelle
de couleurs continue à une carte choroplèthe en utilisant la fonction
scale_fill_continuous()
du package {ggplot2} dans R et
comment personnaliser la palette de couleurs.
Les données discrètes sont un type de données quantitatives qui ne peuvent prendre que des valeurs spécifiques et séparées. Elles sont souvent le résultat du dénombrement d’objets ou d’événements. Les données discrètes sont importantes dans
les cartes choroplèthes car elles nous permettent de représenter le nombre ou la quantité d’objets ou d’événements dans différentes régions.
La fonction scale_fill_brewer()
du package {ggplot2}
dans R est utilisée pour appliquer une échelle de couleurs discrète à
une carte choroplèthe.
Avant d’appliquer l’échelle de couleurs discrète, nous devrons créer
une nouvelle colonne discrète, qui pourrait être un niveau de risque
basé sur le nombre de cas. Pour cela, nous pouvons utiliser
mutate()
combiné avec case_when()
.
# Transformer les données : Créer une nouvelle colonne 'risk' basée sur le nombre de cas en 2021
malaria3 <- malaria2 %>%
mutate(risk = case_when(cases_2021 < quantile(cases_2021, 0.5) ~ 'faible',
cases_2021 > quantile(cases_2021, 0.75) ~ 'élevé',
TRUE ~ 'moyen'))
# Visualiser les données
ggplot(data = malaria3) +
geom_sf(aes(fill = fct_reorder(risk, cases_2021)))+ # Les niveaux de risque sont réordonnés en fonction du nombre de cas
scale_fill_brewer(palette = "Set4", "Niveaux de Risque")+
theme_bw()
Vous pouvez également créer une palette de couleurs personnalisée pour les variables discrètes.
palette_personnalisée <- c("yellow", "orange", "red") # créer une palette de couleurs personnalisée manuellement
# Appliquer la palette de couleurs personnalisée
ggplot(data = malaria3) + # Créer un objet ggplot
geom_sf(aes(fill = fct_reorder(risk, cases_2021))) + # réordonner les étiquettes de risque selon le nombre de cas
scale_fill_manual(values = palette_personnalisée, name = "Niveaux de Risque") +
coord_sf(expand = TRUE) +
ggtitle("Niveaux de Risque de Paludisme par Région Basés sur les Cas de 2021") + # Ajouter un titre ici
theme_bw()
Dans cette section, nous avons appris comment appliquer une échelle
de couleurs discrète à une carte choroplèthe en utilisant la fonction
scale_fill_brewer()
du package {ggplot2} et comment
personnaliser la palette de couleurs.
Q : Créez votre propre palette de couleurs
Créez votre propre palette de couleurs distincte de celle initiale, et affichez les cas de paludisme à travers le Nigeria pour 2000 en utilisant cette palette personnalisée. N’oubliez pas d’intégrer des améliorations esthétiques supplémentaires.
facet_wrap()
: Cette fonction enveloppe une séquence 1D
de panneaux en 2D. C’est utile lorsque vous avez une seule variable avec
de nombreux niveaux et que vous souhaitez organiser les graphiques de
manière plus efficace en termes d’espace.facet_grid()
: Cette fonction crée une matrice de
panneaux définis par des variables de facettage en lignes et en
colonnes. Elle est la plus utile lorsque vous avez deux variables
discrètes et que toutes les combinaisons de variables existent dans les
données.facet_wrap()
est utilisé pour le facettage d’une seule
variable, tandis que facet_grid()
est utilisé pour le
facettage de deux variables.facet_wrap()
organise les panneaux en grille 2D, tandis
que facet_grid()
les organise en matrice.facet_wrap()
Nous pouvons utiliser la fonction facet_wrap()
pour
créer de multiples petits graphiques basés sur une variable donnée. Dans
l’exemple suivant, nous pouvons utiliser la variable
année
.
Rappelez-vous que l’échelle des couleurs peut être ajustée par
scale_fill_continuous()
si la variable est continue ou par
scale_fill_brewer()
si la variable est discrète.
Ici, nous devons faire un léger ajustement à la structure de notre
jeu de données. Puisque les cas sont présentés par année et que chaque
année est représentée dans une colonne séparée, nous utiliserons la
fonction pivot_longer()
pour les consolider dans une seule
colonne, accompagnée d’une clé d’identifiant.
malaria3_longer <- malaria3 %>%
pivot_longer(cols = `cases_2000`:`cases_2021`, names_to = "year", values_to = "cases")
Il semble que la variable année
dans notre jeu de
données ait un préfixe cases_
que nous aimerions supprimer
pour des raisons esthétiques avant de tracer.
Voici comment nous pouvons le faire en utilisant la fonction
str_replace()
du package {stringr}, qui fait partie du
tidyverse :
# Recoder la variable 'année' en supprimant le préfixe 'cases_'
malaria3_longer$year <- str_replace(malaria3_longer$year, "cases_", "")
Après avoir exécuté le code ci-dessus, la variable année
dans notre jeu de données malaria3_longer
n’aura plus le
préfixe cases_
, la rendant plus propre pour des fins de
visualisation.
Maintenant, nous voulons créer de multiples petits graphiques en
utilisant facet_wrap()
.
# Créer un objet ggplot en utilisant facet_wrap
ggplot(data = malaria3_longer) +
geom_sf(aes(fill = cases)) +
facet_wrap(~ year)+
scale_fill_continuous(low = "green", high = "red") + # appliquer l'échelle de couleur continue
theme_void()
Nous pouvons ajouter une autre variable au facet_wrap()
.
Ici, nous ajoutons risk
, mais nous utiliserons uniquement
les cas de 2000 et 2021 à des fins de démonstration :
ggplot() +
geom_sf(data = nga_adm1) +
geom_sf(aes(fill = cases), data = filter(malaria3_longer, year %in% c("2000", "2021"))) +
facet_wrap(year ~ risk)+
coord_sf(expand = TRUE)+
scale_fill_continuous(low = "green", high = "red")+
theme_void()
Dans le dernier graphique ci-dessous, vous remarquerez que nous avons
utilisé une variable de remplissage continue, mais nous avons également
utilisé un facet_wrap
sur deux autres variables
discrètes.
facet_grid()
Maintenant, nous utiliserons facet_grid()
pour créer une
grille de graphiques. Pour chaque année (2000 et 2021), des graphiques
séparés sont réalisés pour chaque niveau de risque, offrant une
comparaison visuelle facile à la fois sur les années et les risques.
ggplot() +
geom_sf(data = nga_adm1) + # besoin du
geom_sf(aes(fill = cases), data = filter(malaria3_longer, year
%in% c("2000", "2021"))) +
facet_grid(year ~ risk)+
coord_sf(expand = TRUE)+
scale_fill_continuous(low = "green", high = "red")+
labs(title = "Distribution des cas de paludisme et niveaux de risque au Nigéria",
subtitle = "2000 & 2021")+
xlab("Longitude")+
ylab("Latitude")+
theme_void()
facet_grid()
est idéal lorsque vous avez deux facteurs
et que vous voulez explorer chaque combinaison.
facet_wrap()
est mieux lorsque vous avez juste un facteur
ou lorsque vous avez plusieurs facteurs mais que vous voulez une
disposition plus simple.
Le choix entre les deux dépend souvent des besoins spécifiques de vos données et de la manière dont vous souhaitez visualiser les relations.
Q : Analysez la distribution des cas de paludisme
Votre objectif maintenant est d’analyser la distribution des cas de paludisme au Nigéria pour les années 2000 et 2021. Mais vous devrez d’abord catégoriser les données en niveaux de risque en utilisant la médiane (haut/bas), puis visualiser ces informations sur une carte.
Dans cette section, nous avons appris les différences entre
facet_wrap()
et facet_grid()
, et comment créer
de multiples petits graphiques en utilisant ces deux fonctions.
Aujourd’hui, nous sommes allés en profondeur dans le monde des cartes choroplèthes, débloquant le pouvoir de la représentation géographique visuelle.
Vous avez gagné des connaissances sur :
L’essence et les composants d’une carte choroplèthe.
Les avantages et inconvénients de ces cartes.
Les essentiels de la préparation des données pour la visualisation choroplèthe.
La création de cartes avec {ggplot2} et l’application de palettes de couleurs variées.
L’utilisation de facet_wrap()
et
facet_grid()
pour des conceptions de cartes
complexes.
Félicitations pour avoir terminé cette leçon ! Récapitulons le voyage cognitif que vous avez entrepris :
Connaissance & Compréhension :
Reconnu la définition et les composants d’une carte choroplèthe.
Compris les avantages et les limitations des cartes choroplèthes.
Application :
Préparé des données spécifiquement pour la création d’une carte choroplèthe.
Utilisé {ggplot2} dans R pour concevoir une carte choroplèthe.
Mis en œuvre des techniques d’échelle de couleurs continues et discrètes.
Analyse :
Synthèse :
facet_wrap()
et
facet_grid()
.Avec ces compétences en main, vous êtes maintenant équipé pour innover avec différents ensembles de données et les visualiser de manière impactante. Plongez, expérimentez et améliorez votre voyage dans la création de cartes en utilisant {ggplot2} dans R. Bonne cartographie !
1. Construisez votre magnifique carte choroplèthe
Construisez une carte choroplèthe pour afficher la répartition des
cas de paludisme en 2019, en utilisant la colonne
cases_2019
du jeu de données malaria2
. Vous
pouvez améliorer le design et la clarté de votre carte en incorporant
des titres, des étiquettes d’axes et toute autre étiquette
pertinente.
ggplot(data=malaria2) +
geom_sf(aes(fill=cases_2015)) +
labs(title = "Cas de Paludisme au Nigeria (2015)",
fill = "Compte des Cas",
x = "Longitude",
y = "Latitude") +
ggspatial::annotation_north_arrow(location = "br")+
ggspatial::annotation_scale(location = "tr")+
theme_void()
2. Créez votre propre palette de couleurs
Créez votre propre palette de couleurs distincte de celle initialement fournie ci-dessous, et affichez les cas de paludisme à travers le Nigeria pour 2000 en utilisant cette palette de couleurs personnalisée. N’oubliez pas d’incorporer des améliorations esthétiques supplémentaires.
new_palette <- c("grey", "orange", "red") # Définir un ensemble différent de couleurs
ggplot(data=malaria3) +
geom_sf(aes(fill = fct_reorder(risk, cases_2000))) + # Réordonner les étiquettes de risque selon les cas de l'année 2000
scale_fill_manual(values = new_palette, "Niveaux de Risque") +
labs(title = "Répartition des Cas de Paludisme au Nigeria",
fill = "Compte des Cas",
x = "Longitude",
y = "Latitude") +
coord_sf(expand = TRUE)+
theme_void()
3. Analysez la distribution des cas de paludisme
Votre objectif est maintenant d’analyser la distribution des cas de paludisme au Nigeria pour les années 2000 et 2021. Mais vous devrez d’abord catégoriser les données en niveaux de risque en utilisant la médiane (haut/bas), puis visualiser ces informations sur une carte.
# Pivotement des données
malaria3_longer <- malaria2 %>%
pivot_longer(cols = `cases_2000`:`cases_2021`, names_to = "année", values_to = "cas")
# Catégorisation du risque basée sur la médiane
malaria3_longer %>%
mutate(risk = case_when(
cas <= median(cas) ~ 'faible',
cas > median(cas) ~ 'élevé'
)) -> malaria3_longer2
# Nettoyage des valeurs d'année
malaria3_longer2$année <- str_replace(malaria3_longer2$année, "cases_", "")
# Tracé des données
ggplot() +
geom_sf(data = nga_adm1) +
geom_sf(aes(fill = cas), data = filter(malaria3_longer2, année %in% c("2000", "2021"))) +
facet_grid(année ~ risk) +
coord_sf(expand = TRUE) +
scale_fill_continuous(low = "green", high = "red") +
labs(title = "Cas de paludisme et niveaux de risque au Nigeria",
subtitle = "2000 & 2021") +
xlab("Longitude") +
ylab("Latitude") +
theme_void()
Les membres de l’équipe suivants ont contribué à cette leçon :
Wickham, Hadley, Winston Chang, and Maintainer Hadley Wickham. “Package ‘ggplot2’.” Create elegant data visualisations using the grammar of graphics. Version 2, no. 1 (2016): 1-189.
Wickham, Hadley, Mine Çetinkaya-Rundel, and Garrett Grolemund. R for data science. ” O’Reilly Media, Inc.”, 2023.
Lovelace, Robin, Jakub Nowosad, Jannes Muenchow. Geocomputation with R. CRC Press, 2019.
This work is licensed under the Creative Commons Attribution Share Alike license.