Si vous travaillez avec des données, quelque soit votre domaine d’application, il y a fort à parier qu’un jour ou l’autre vous aurez besoin de représenter des données sur une carte géographique administrative. Et notamment de faire une carte thématique, qui utilise une variation de couleurs pour représenter des données statistiques agrégées par zones géographiques, telles que les pays, les états, les provinces ou les villes. Ce type de carte s’appelle une carte choroplèthe .
🤩 Dans ce tutoriel, je vais vous montrer comment faire facilement une carte thématique, avec R.
J’avais déjà publié (il y a plusieurs années) un article sur les cartes choroplèthes, mais il était basé sur le package GADMTools, qui n’est plus disponible sur CRAN. Je vous propose donc ici une autre solution. Pour consulter ce premier article, c’est ici 👉 https://delladata.fr/dessinez-des-cartes-administratives-avec-gadmtools/
Pour dessiner une carte thématique, vous aurez besoin de données de contours de la zone (pays, région, département) que vous voulez représenter. Ces données sont regroupées dans des fichiers qui peuvent être de différents formats, par exemple shapefile, geojson, DBI (PostGIS), gpkg.
Pour les données de contours de la France, je vous conseille de les télécharger ici https://github.com/gregoiredavid/france-geojson, car c’est facile (pas besoin de chercher dans des sous dossiers), le découpage des régions correspond aux modifications de 2018, et vous obtiendrez également des fichiers de contours individuels pour chaque région et chaque département.
Si vous souhaitez les contours d’un autre pays, vous pourrez sans doute les trouvez ici https://www.diva-gis.org/datadown
Si vous les téléchargez sur ce site, vous allez obtenir plusieurs fichiers correspondants à différentes granulométries (régions, départements, communes, etc), et sous différents formats (.cpg, .csv, .prj, .shp, .shx).
Les différentes granulométries correspondent à des suffixes de 0 à 5 dans les noms des fichiers. Plus le chiffre est élevé, plus la précision est importante. Par exemple, pour la France, ça serait :
Attention, les contours des régions françaises sont antérieures à la réforme.
Ensuite, il vous faudra les installer les packages suivants :
sf
pour importer dans R les données de contours (à partir des fichiers téléchargés) et les passer en tibble (version tidyverse d’un data frame)
tidyverse
pour réaliser la jointure avec vos données d’intérêt que vous souhaitez représenter (une population, un rendement agricole, un nombre de clients) et pour la manipulation des données aux format tibble (par exemple filtrer les donnée d’une sous zone d’intéret). Et aussi pour utiliser le package ggplot2
qui est contenu dans tidyverse
tmap
: pour employer des fonctions qui s’intègrent à ggplot2
et qui permettent de tracer les contours
library(tidyverse)
library(sf)
library(tmap)
Les étapes sont les suivantes :
ggplot2
J’ai placé le dossier des données de contours (france-geojson-master) téléchargées précédemment à la racine de mon projet R. J’importe les données au format .geojson
en utilisant la fonction read.sf()
du package sf
# importation des données de contour au format.geojson et passage en tibble
Fr.reg <-read_sf("france-geojson-master/regions-version-simplifiee.geojson")
View(Fr.reg)
Voici le tibble obtenu à partir du fichier geojson :
Les données de contours sont dans la variable geometry
.
J’ai téléchargé des données de populations des régions ici https://www.ined.fr/fr/tout-savoir-population/chiffres/france/structure-population/regions/, j’ai placé le fichier xls dans le dossier data
de mon projet R. Voici à quoi ressemble les données téléchargées :
J’ai gardé le fichier des populations tel quel, et j’utilise l’argument range
pour préciser la zone de cellules à télécharger (A2:E15). Je modifie ensuite le nom de la première variable, car la colonne ne portait pas nom et R l’a nommé ...1
et aussi le nom de la variable concernant à la population de 2023 en Pop
pour faciliter la manipulation, puis je ne garde que ces deux variables :
brary(readxl)
# importation des données de population
Pop.reg <- read_excel("data/fr_population.region.departement.xls", range = "A2:E15")
names(Pop.reg)
## [1] "...1" "Recensement 1990" "Recensement 1999"
## [4] "1er janvier 2008" "1er janvier 2023 (p)"
# modification du nom de la première colonne
names(Pop.reg)[1] <- "Region"
names(Pop.reg)[5] <- "Pop"
names(Pop.reg)
## [1] "Region" "Recensement 1990" "Recensement 1999" "1er janvier 2008"
## [5] "Pop"
# selection des colonnes 1 et 5 seulement
Pop.reg <- Pop.reg %>%
dplyr::select(Region, Pop)
View(Pop.reg)
Voici le data frame obtenu
J’ajoute la population au tibble des données de contours, par une jointure gauche, en utilisant comme clé primaire la région (qui se nomme nom
dans le data frame de contours et Region
dans le data frame des données de population).
Pour que la jointure fonctionne, il faut que l’orthographe des régions soit identique dans les 2 tableaux. Comme ce n’est pas le cas ici (espaces différents), je vais ordonner les deux data frame par ordre alphabétique des régions et je vais recopier le nom des régions de l’un des tibbles dans le second :
Voici le data frame finalement obtenu :
# tri par ordre alphabétique
Fr.reg <- Fr.reg %>%
arrange(nom)
Fr.reg$nom
## [1] "Auvergne-Rhône-Alpes" "Bourgogne-Franche-Comté"
## [3] "Bretagne" "Centre-Val de Loire"
## [5] "Corse" "Grand Est"
## [7] "Hauts-de-France" "Normandie"
## [9] "Nouvelle-Aquitaine" "Occitanie"
## [11] "Pays de la Loire" "Provence-Alpes-Côte d'Azur"
## [13] "Île-de-France"
# tri par ordre alphabétique
Pop.reg <- Pop.reg %>%
arrange(Region)
Pop.reg$Region
## [1] "Auvergne-Rhône-Alpes" "Bourgogne- Franche-Comté"
## [3] "Bretagne" "Centre - Val de Loire"
## [5] "Corse" "Grand Est"
## [7] "Hauts-de-France" "Normandie"
## [9] "Nouvelle Aquitaine" "Occitanie"
## [11] "Pays de la Loire" "Provence-Alpes-Côte d'Azur"
## [13] "Île-de-France"
# je remplace les modalités de Region du fichier Pop par les modalités nom du fichier Pop
Fr.reg$nom <- Pop.reg$Region
# Comparaison des noms de régions
Fr.reg$nom == Pop.reg$Region
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
# joiture gauche
Fr.reg <- Fr.reg %>%
left_join(Pop.reg, by=c("nom"="Region"))
View(Fr.reg)
Ne reste plus que la dernière étape : tracer la carte thématique.
Les contours sont dessinés grâce à la fonction geom_sf
. Et les couleurs sont ajoutées avec la couche scale_fill_gradient().
ggplot() +
geom_sf(data = Fr.reg, aes(fill = Pop)) +
scale_fill_gradient(low = "white", high = "orange") +
theme_void()
Ici un autre exemple avec une palette divergente, qui permet de visualiser en bleu les régions les moins peuplées (relativement à 500 0000), et en rouge les régions les plus peuplées.
ggplot() +
geom_sf(data = Fr.reg, aes(fill = Pop)) +
scale_fill_gradient2(low = "blue", high = "red", mid=5000000) +
coord_sf() +
theme_void()
Et voilà 🤩
La carte étant réalisée avec ggplot2
vous pouvez modifier tous les éléments facilement.
J’espère que ce tutoriel vous aidera à représenter vos cartes thématiques sans trop de difficultés.
Si cette thématique de la cartographie vous intéresse particulièrement, vous pouvez consulter mon premier article sur les cartes thématiques Dessinez des cartes administratives avec GADMTools, avec des informations complémentaires, ainsi que l’article Comment réaliser une carte avec des données libres dans R ? rédigé par Arnaud Milet et Emmanuelle Sourisseau, du bureau d’étude d-sidd.
Retrouver le planning et les programmes de mes formations ici 👇👇👇
Retrouver mes propositions de services ici 👇👇👇
C’est possible en faisant un don sur la page Tipeee du blog
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.
6 Responses
Super merci
la jointure si elle avait été moins forte aurait put être faite par normalisation des noms (majuscules sans accents) et rapprochement des noms par distance (Levenshtein ou autre). Ce pourrait être un sujet pour un prochain tutoriel.
Merci; quel(le)s moyens ou techniques permettraient d’avoir des cartes analogues, mais interactives ?
Bonjour Eric
sans doute avec leaflet. Vous trouverez quelques pistes dans cet article : https://delladata.fr/comment-realiser-une-carte-avec-donnees-libres-r/
Si vous trouvez une solution simple, n’hésitez pas à le partager dans un autre commentaire.
Bonsoir,
en fait je n’arrive pas à importer les données de contour au “format.geojson” et passer en “tibble”. En fait quand je fais le code, c’est cela qui s’affiche ” Error: Cannot open “france-geojson-master/regions-version-simplifiee.geojson”; The file doesn’t seem to exist.” Or le dossier de contour est placé à la racine de mon projet R
Bonjour,
Peut être un problème d’orthographe, ou de répertoire de travail qui n’est pas à la racine du projet R.
Vous pouvez lancer cette commande, pour voir les fichiers présents dans le répertoire de travail
list.files()
Si le dossier france-geojson-master est bien là, vous pouvez ensuite afficher les fichiers présents dans ce répertoire avec cette commande:
list.files("france-geojson-master")
J’espère que cela vous aide.
Bonne continuation
Marine M. m’a envoyé cette astuce pour télécharger les données de contours :
“il existe une autre façon de télécharger les contours d’un pays, région ou département. Il suffit d’utiliser le package `geodata` et la fonction `gadm()` (en référence au site éponyme). (…) je trouve ça plus simple et moins contraignant d’utiliser cette fonction que de devoir télécharger à chaque fois les contours d’un pays qu’on cherche spécifiquement. De plus, cela permet de ne pas encombrer l’espace libre de notre ordinateur qui peut très vite se remplir au vue de la taille de certains shapefile (le shapefile est juste téléchargé en cache sur notre environnement R)”