Tutoriel : réaliser une carte thématique avec R

Réaliser une carte choroplete avec R

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/

Table des matières

Prérequis

Données de contours

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.

Contenu du dossier téléchargé

Si vous souhaitez les contours d’un autre pays, vous pourrez sans doute les trouvez ici https://www.diva-gis.org/datadown

Téléchargement de fichiers de contours géographiques

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 :

  • 0 : le pays
  • 1 : les régions
  • 2 : les départements
  • 3 : les arrondissement
  • 4 : les cantons
  • 5 : les communes

Attention, les contours des régions françaises sont antérieures à la réforme.

Packages

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 pour tracer une carte thématique choroplèthe

Les étapes sont les suivantes :

  1. importer les données brutes de contours et les données que l’on souhaite représenter
  2. ajouter les données que l’on souhaite représenter aux données de contours, par une jointure (il faudra véiller à ce que les noms des zones soient identiques dans les deux data frame)
  3. tracer la carte thématique avec les couleurs par zone, en employant ggplot2

Exemple d’une carte thématique de la population au niveau régional

Importation des données

Les données de contours

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 :

Données des contours de régions obtenues

Les données de contours sont dans la variable geometry.

Les données de population

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 :

détail des données de population

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

Données de population importées

Assemblage des données par jointure

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 : 

Données assemblées
# 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) 

Dessiner la carte thématique

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() 
Carte thématique obtenue

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() 
carte choroplete

Et voilà 🤩

La carte étant réalisée avec ggplot2 vous pouvez modifier tous les éléments facilement.

Conclusion

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.

6 Responses

  1. 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.

  2. 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

    1. 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

  3. 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)”

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous souhaitez vous former à R, ou aux statistiques ?

Retrouver le planning et les programmes de  mes formations ici  👇👇👇 

Vous avez besoin d'un assitance pour analyser vos données ?

Retrouver mes propositions de services ici  👇👇👇 

Vous souhaitez soutenir mon travail ?​

C’est possible en faisant un don  sur la page Tipeee du blog  👇👇👇

Bonjour !

vous venez souvent ?

Identifiez-vous pour avoir accès à toutes les fontionnalités !

Aide mémoire off'R ;)

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.