Faire une carte choroplète avec R et ggplot2
0.1 Pré-requis 1: Le shapefile
Pour faire une carte avec le logiciel R vous avez besoin d’un fichier qui délimite les contours géographiques souvent connu sous le nom de shapefile. Vous pouvez télécharger le shapefile de n’importe quel pays gratuitement sur ce site. Il vous suffit d’entrer le nom du pays dans la barre de recherche. Pour cet exemple nous utiliserons le shapefile du Sénégal et les données de production de mil qui sont téléchargeables via ce lien. Faites un clic-droit puis ouvrez dans un nouvel onglet pour accéder aux données et les mettre dans votre dossier de travail.
0.2 Pré-requis 2: Vos données
Dans l’exemple suivant,il a été préparé un fichier de données dans laquelle on peut avoir les informations des coordonnées géographiques, le nom des régions de même que les productions de mil (en tonne) suivant ces régions.Notez qu’ici, une colonne nommée “id” a été créée. Cette colonne porte les identifiants du nom des régions tel que définit sur le shapefile en question. Ceci nous permettra plus tard de joindre les données de contour venant du shapefile à celle de nos données.Plus d’amples explicaions seront données dans les lignes de codes.
0.3 Pré-requis 3: Installation des packages
Pour installer un package dans R Studio, il vous suffit juste de cliquer sur Packages, puis Install et d’y insérer le nom de votre package. Une autre maniere de faire est la suivante:
install.packages("le_nom_du_package", dependencies=TRUE)
Notez qu’ici “dependencies = TRUE” veut simplement dire de prendre en compte les sous-modules constitutifs du package en question. Pour cette séries de tutoriels, nous aurons besoin des packages:
- rgdal;
- mapdata ;
- mapproj ;
- maps ;
- ggplot2 ;
- ggrepel ;
- legendMap.
0.4 A présent, passons à la pratique!
Etape 1: Définir notre répertoire de travail
setwd("C:/Users/ANGE/Documents/R MAP")Etape 2: Charger les packages
library(rgdal)
library(mapdata)
library(mapproj)
library(maps)
library(ggplot2)
library(ggrepel)
library(legendMap)
library(dplyr)Etape 3: Définir l’adresse du dossier contenant votre shapefile
Pour faciliter d’usage, nous garderons le même dossier que celui précédemment défini.
mySHP = "C:/Users/ANGE/Documents/R MAP"Etape 4: Importer le shapefile
myFile = readOGR(mySHP, layer = "SEN_adm1", stringsAsFactors = FALSE)OGR data source with driver: ESRI Shapefile
Source: "C:\Users\ANGE\Documents\R MAP", layer: "SEN_adm1"
with 14 features
It has 9 fields
Integer64 fields read as strings: ID_0 ID_1
SEN_adm1 est le nom du shapefile représentant les régions du Sénégal au moment du téléchargement du fichier zip en 2017. En 2020, le nouveau nom du fichier shapefile mis à jour est gadm36_SEN_1. Vous pouvez donc changer le nom du fichier à votre convenance
Etape 5: Accéder au données inhérantes au shapefile
Saisir :
myFile@data
Les données présentées dans le tableau 1 s’afficheront.
Table 1: Tableau de données du shapefile.
| ID_0 | ISO | NAME_0 | ID_1 | NAME_1 | TYPE_1 | ENGTYPE_1 | NL_NAME_1 | VARNAME_1 | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 201 | SEN | Senegal | 1 | Dakar | Région | Region | NA | Cap Vert|Dacar |
| 1 | 201 | SEN | Senegal | 2 | Diourbel | Région | Region | NA | NA |
| 2 | 201 | SEN | Senegal | 3 | Fatick | Région | Region | NA | NA |
| 3 | 201 | SEN | Senegal | 4 | Kédougou | Région | Region | NA | Sénégal Oriental |
| 4 | 201 | SEN | Senegal | 5 | Kaffrine | Région | Region | NA | NA |
| 5 | 201 | SEN | Senegal | 6 | Kaolack | Région | Region | NA | NA |
| 6 | 201 | SEN | Senegal | 7 | Kolda | Région | Region | NA | NA |
| 7 | 201 | SEN | Senegal | 8 | Louga | Région | Region | NA | NA |
| 8 | 201 | SEN | Senegal | 9 | Matam | Région | Region | NA | NA |
| 9 | 201 | SEN | Senegal | 10 | Sédhiou | Région | Region | NA | NA |
| 10 | 201 | SEN | Senegal | 11 | Saint-Louis | Région | Region | NA | Fleuve|Vallée du Fleuve |
| 11 | 201 | SEN | Senegal | 12 | Tambacounda | Région | Region | NA | Sénégal Oriental |
| 12 | 201 | SEN | Senegal | 13 | Thiès | Région | Region | NA | NA |
| 13 | 201 | SEN | Senegal | 14 | Ziguinchor | Région | Region | NA | NA |
Cette information vous sera utile pour les étapes 6 et concernant la jointure de vos données à celle du shapefile.
Etape 6: Changer le format du shapefile en “dataframe” (en style tableau).
Cette étape est cruciale pour que le package ggplot2 puisse implimenter les coordonées comme celà se doit.
myDF = fortify(myFile, region = "NAME_1")Vous remarquerez le détails concernant l’argument “region” qui est “NAME_1”. C’est simplement l’identifiant de chaque région (Voir la colonne 6 du tableau 1).
Etape 7: Voir les 6 premieres lignes du nouveau fichier transformé
Saisir:
head(myDF, 6)
Tableau 2: Données du shapefile transformées au format tableau
| long | lat | order | hole | piece | id | group |
|---|---|---|---|---|---|---|
| -17.16056 | 14.89375 | 1 | FALSE | 1 | Dakar | Dakar.1 |
| -17.16004 | 14.89333 | 2 | FALSE | 1 | Dakar | Dakar.1 |
| -17.16000 | 14.89335 | 3 | FALSE | 1 | Dakar | Dakar.1 |
| -17.15683 | 14.89042 | 4 | FALSE | 1 | Dakar | Dakar.1 |
| -17.15592 | 14.88957 | 5 | FALSE | 1 | Dakar | Dakar.1 |
| -17.15551 | 14.88920 | 6 | FALSE | 1 | Dakar | Dakar.1 |
Vous remarquerez long et lat comme nom des colonnes 1 et 2 respectivement. Nous allons changer celà en Longitude et Latitude dans l’étape suivante.
Etape 8: Renommer les colonnes long et lat en Longitude et Latitude
myDF = rename(myDF, Longitude = long, Latitude = lat)Etape 9: Importation de nos données
mydata = read.csv("production.csv", header = TRUE, sep = ";", dec = ",")Tableau 3: Tableau de données de production du mil suivant les régions du Sénégal
| long | lat | Region | Production | id |
|---|---|---|---|---|
| -17.50 | 14.72 | Dakar | 0 | Dakar |
| -16.21 | 14.79 | Diourbel | 61982 | Diourbel |
| -16.52 | 14.00 | Fatick | 182000 | Fatick |
| -15.08 | 14.10 | Kaolack | 144938 | Kaolack |
| -14.56 | 12.94 | Kolda | 41023 | Kolda |
| -15.30 | 15.20 | Louga | 26390 | Louga |
| -15.10 | 16.30 | Saint-Louis | 31 | Saint-Louis |
| -13.64 | 13.75 | Tambacounda | 44855 | Tambacounda |
| -16.92 | 14.76 | Thies | 57318 | Thiès |
| -16.40 | 12.73 | Ziguinchor | 3878 | Ziguinchor |
| -13.80 | 15.20 | Matam | 5366 | Matam |
| -15.87 | 13.70 | Kaffrine | 171560 | Kaffrine |
| -12.52 | 12.80 | Kedougou | 0 | Kédougou |
| -15.56 | 12.79 | Sedhiou | 67703 | Sédhiou |
*Détail important
La colonne “id” de nos données porte les mêmes noms que celle du shapefile. Vous remarquerez que l’orthographe des noms est un bizarre. C’est dû aux accents dans la langue française. Ne vous inquitez pas pour celà. Le plus important est d’avoir les mêmes identifiants tant au niveau du shapefile qu’au niveau de vos données afin de faciliter la jonction qui aura lieu à l’étape 10.
Etape 10: Joindre vos données à celles du shapefile
Pour la jonction, nous utiliserons la fonction “left_join” (qui veut dire littéralement : Joindre par la gauche).
plotData <- left_join(myDF, mydata)Ne vous inquiétez pas si vous voyez le message suivant:
## Joining, by = "id"
## Warning: Column `id` joining character vector and factor, coercing into
## character vector
C’est juste un avertissement relatif à la jonction des deux jeux de données.
Etape 11: Faire la carte
p <- ggplot() +
#Dessiner le contour de la carte du Senegal avec les regions
geom_polygon(data = plotData, aes(x = Longitude, y = Latitude, group = group, fill = Production), color = "black", size = 0.15) +
#Ajouter le nom des regions suivant les coordonnees geographiques en police "gras"
geom_text(data=mydata, aes(x=long, y=lat, label=Region), fontface = 'bold')+
# Mettre le nom de la legende. \n permet d'aller a la ligne
scale_fill_gradient(name="Production\nde mil\n(tonne)",
# Definir une echelle de valeur selon vos donnees
limits = c(0, 190000),
#Definir une echelle de couleur pour distinguer les regions suivant leur production
low="white", high="forestgreen")+
#Definir le type de projection voulue. Ici, la projection de Lagrange.
coord_map(projection = "lagrange") +
# La position du Nord geographique
scale_bar(lon = -17.7, lat = 13,
# Les mesures du symbole du Nord georaphique en termes de longueur (distance_lat) et de hauteur (distance_lon)
distance_lon = 40, distance_lat = 10,
# La distance relative de la legende du symbole du Nord geographique
distance_legend = 25, dist_unit = "km",
# Definir la longueur de la fleche du symbole du Nord geographique
arrow_length = 10,
# Definir la distance separant la fleche de la barre d'echelle du symbole du Nord geographique
arrow_distance = 50,
# Definir la taille de la fleche du symbole du Nord geographique
arrow_north_size = 6)+
# Definir un style d'arriere-plan, Ici, rien en arriere plan.
theme_void() Et Voici le rendu…
Si au besoin vous voulez customiser votre carte, vous pouvez changer l’arriere-plan ou agir sur les noms des régions par example.
Ci-dessous le code
g <- ggplot() +
geom_polygon(data = plotData, aes(x = Longitude, y = Latitude, group = group,
fill = Production), color = "black", size = 0.15) +
geom_point(data = mydata, aes(x = long, y = lat), shape = 21, fill = "white",
size = 3, color = "black") +
geom_label_repel(data = mydata, aes(x = long, y = lat, label = Region), fontface = "bold",
color = "black", box.padding = 0.35, point.padding = 0.5, segment.color = "grey10") +
scale_fill_gradient(name = "Production\nde mil\n(tonne)", limits = c(0, 190000),
low = "white", high = "forestgreen") +
coord_map(projection = "lagrange") + scale_bar(lon = -17.7, lat = 13, distance_lon = 40,
distance_lat = 10, distance_legend = 25, dist_unit = "km", arrow_length = 10,
arrow_distance = 50, arrow_north_size = 6) +
theme_minimal() + theme(panel.grid.major = element_line(colour = "black", size = 0.5,
linetype = "dotted")) + theme(plot.background = element_rect(colour = "white",
size = 1)) + ggtitle("Production de mil")Voici le rendu…
0.5 Exportez votre carte avec une haute résolution
Exportez au format vectoriel pdf
ggsave(p, file = "carte.pdf", limitsize = FALSE, width = 12, height = 10.5, dpi=500 )
Exportez au format Cairo PNG
ggsave(p, file = "carte.png", limitsize = FALSE, width = 10, height = 6.5, type = "cairo-png", dpi=500)
Vous pouvez ajuster les dimensions et la résolution (dpi) selon votre bon-vouloir. Le dpi (pixelisation) par défaut est de 300.