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.