delladata

Tutoriel : Dessinez vos premières cartes avec ggplot2

Table des matières

Introduction

Lorsqu’on analyse des données, il est courant de devoir positionner sur une carte géographique des emplacements tels que des points de prélèvement, des parcelles agricoles ou des sites de production, par exemple.

Utiliser R pour réaliser des cartes et positionner des emplacements présente plusieurs avantages. Tout d’abord, cela permet d’intégrer cette tache dans son flux de travail, et de ne pas utiliser un autre logiciel, ce qui réduit les risques d’erreurs et économise du temps. Ensuite, cela permet d’avoir accès à des packages performants pour la manipulation des données spatiales, comme le package sf. Cela permet encore d’employer ggplot2 pour dessiner ses cartes et les personnaliser facilement (couleur, titre, légende). Enfin, R permet de traiter de grands volumes de données.

Dans ce tutoriel, je vais vous montrer en pas à pas, comment créer des cartes géographiques et positionner facilement des lieux dessus.

Le principe

La méthode que je vous propose dans cet article est très simple, elle consiste à :

  1. Télécharger le fond de carte depuis le package geodata
  2. Transformer l’objet obtenu en type sf afin de le rendre très facilement manipulable
  3. Dessiner la carte avec ggplot2
  4. Obtenir les coordonnées GPS des sites que vous souhaitez ajouter
  5. Ajouter ces emplacements sous forme de points

 

Dans ce tutoriel, nous allons réaliser une carte de France et ajouter quelques sites dessus.

Etape 1 : Importation du fond de carte de la France

Les fonds de carte peuvent être importés dans R, depuis le projet GADM (Global Administrative Areas), par l’intermédiaire du package geodata et sa fonction gadm.

Le projet GADM est une initiative qui vise à représenter les limites administratives des pays du monde entier. C’est une base de données spatiale de grande précision qui couvre tous les pays et contient les niveaux d’administration, avec des noms et des codes de localités pour chaque niveau.

Les pays doivent être indiqués, dans l’argument country par leur code ISO (vous pourrez les trouver ici : https://documentation.abes.fr/sudoc/formats/CodesPays.html) L’argument level correspond aux différentes divisions administratives d’un pays. Pour la France :

  • level=0 : le pays lui-même (par exemple la France).
  • level=1 : régions administratives (par exemple, Île-de-France, + Nouvelle-Aquitaine, etc.).
  • level=2 : départements (par exemple, Paris, Gironde, Rhône, etc.).
  • level=3 : arrondissements ou subdivisions similaires.

 

Notez que le niveau exact des divisions peut varier selon les pays et que pour certains pays, il n’y a peut-être pas de données disponibles pour tous les niveaux.

library(geodata)
Fr <-gadm(country = "FR" , level=0,  path=tempdir())
plot(Fr) 
Fr.reg <- gadm(country = "FR" , level=1,  path=tempdir())
plot(Fr.reg) 
Fr.dep <- gadm(country = "FR" , level=2,  path=tempdir())
plot(Fr.dep) 
Fr.arr <- gadm(country = "FR" , level=3,  path=tempdir())
plot(Fr.arr) 

L’argument path=tempdir() spécifie l’emplacement où les données téléchargées seront temporairement stockées sur votre ordinateur. Plus précisément :

path est l’argument qui permet de définir le dossier de destination où les fichiers seront téléchargés et enregistrés.

tempdir() est une fonction de R qui renvoie un dossier temporaire propre à la session R en cours. Ce dossier est utilisé par R pour stocker temporairement des fichiers pendant une session, et son contenu est généralement effacé lorsque vous fermez R.

C’est utile si vous ne souhaitez pas conserver ces données après avoir terminé votre session R actuelle. Si vous souhaitez les conserver pour une utilisation ultérieure, vous devriez spécifier un autre chemin pour l’argument path.

Etape 2 : Transformation en objet sf

Si vous regardez la classe de l’objet renvoyé par la fonction gadm() vous verrez qu’il s’agit de la classe SpatVector .

str(Fr.reg)
# S4 class 'SpatVector' [package "terra"] 

Ce type d’objet n’est pas facilement manipulable avec les packages dplyr et ggplot2 que nous allons employer pour dessiner la carte. C’est pour cette raison, qu’il est préférable de le transformer au préalable en objet sf :

Pour transformer une objet de classe SpatVector en classe sf, il est nécessaire d’employer la fonction st_as_sf() du package sf. Ce package c’est l’équivalent de dplyr pour les données spatiales.

 
library(sf)
Fr.reg <- st_as_sf(Fr.reg)
str(Fr.reg)


Classes 'sf' and 'data.frame':  13 obs. of  12 variables:
 $ GID_1    : chr  "FRA.1_1" "FRA.2_1" "FRA.3_1" "FRA.4_1" ...
 $ GID_0    : chr  "FRA" "FRA" "FRA" "FRA" ...
 $ COUNTRY  : chr  "France" "France" "France" "France" ...
 $ NAME_1   : chr  "Auvergne-Rhône-Alpes" "Bourgogne-Franche-Comté" "Bretagne" "Centre-Val de Loire" ...
 $ VARNAME_1: chr  NA NA NA NA ...
 $ NL_NAME_1: chr  NA NA NA NA ...
 $ TYPE_1   : chr  "Région" "Région" "Région" "Région" ...
 $ ENGTYPE_1: chr  "Region" "Region" "Region" "Region" ...
 $ CC_1     : chr  NA NA NA NA ...
 $ HASC_1   : chr  "FR.AR" "FR.BF" "FR.BT" "FR.CN" ...
 $ ISO_1    : chr  NA NA "FR-BRE" "FR-CVL" ...
 $ geometry :sfc_GEOMETRY of length 13; first list element: List of 2
  ..$ : num [1:2555, 1:2] 5.42 5.4 5.38 5.39 5.38 ...
  ..$ : num [1:39, 1:2] 4.98 4.99 4.99 5 5.01 ...
  ..- attr(*, "class")= chr [1:3] "XY" "POLYGON" "sfg"
 - attr(*, "sf_column")= chr "geometry"
 - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA NA NA NA NA ...
  ..- attr(*, "names")= chr [1:11] "GID_1" "GID_0" "COUNTRY" "NAME_1" ... 

L’objet de classe sf est assimilable à un data frame et est compatible avec tidyverse.Vous pouvez alors facilement visualiser les données dans R Studio :

View(Fr.reg) 

Cet objet est un data frame avec une variable supplémentaire, nommée geometry. Il s’agit de données spatiales vectorielles, ici de forme polygone ; elles correspondent aux coordonnées GPS du tracé des régions.

Etape 3 : Plot avec ggplot2

Fond de carte

Pour tracer la carte avec ggplot2 il suffit d’utiliser une couche geom_sf(). L’argument fill=white permet que le fond de la carte soit en blanc.

library(ggplot2)
g1 <- ggplot(data =Fr.reg) +
  geom_sf(fill="white") +
  theme_classic()

g1 

Quelques améliorations

g2 <-g1 +
  theme_void() + #Supprimer les étiquette des coordonnées
  ggtitle("Ma carte") + # ajouter un titre et personnalisation
  theme(plot.title = element_text(hjust = 0.5, 
                                    size=12, 
                                    color="blue", 
                                    face="bold"))
g2 

Il est également possible d’ajouter une flèche nord avec la fonction annotation_north_arrow ou encore une échelle avec la fonction annotation_scale() , du package ggspatial:

library(ggspatial)
g3 <- g2 +
  annotation_north_arrow(location = "bl", # bottom left
                         which_north = "true", 
                         style = north_arrow_fancy_orienteering())+
  annotation_scale(location = "br") # bottom right)
                  

g3 
g4 <- g3 +
  geom_sf(fill="lightyellow", colour="purple") 

g4 

Etape 4 : Obtenir les coordonnées GPS des sites que vous souhaitez ajouter

Les données spatiales (ici les valeurs de la variable geometry) sont définies dans un système de coordonnées de référence (CRS pour Coordinate Reference System en anglais).

Pour positionner des lieux sur la carte, nous allons devoir fournir leurs coordonnées en longitude (axe des x) et latitude (axe des y) dans le même système de référence.

Le CRS des données provenant du projet geodata est le système WGS 84 ; c’est également celui employé par le gps.

C’est donc plutôt facile de trouver les coordonnées d’un lieu, par exemple, en utilisant le site https://www.coordonnees-gps.fr/

Si nous entrons Briançon dans l’adresse, nous allons obtenir :

  • Latitude : 44.8984037
  • Longitude : 6.6436313

Etape 5 : Ajouter ces emplacements sous forme de points

Nous allons positionner la ville de Briançon sur la carte, en utilisant un cercle plein (pch=19) de couleur rouge. Pour cela, nous allons employer une couche geom_point(), et spécifier les coordonnées récupérées précédemment, dans les arguments x et y.

Pour ajouter l’étiquette, nous employons la couche geom_text(), en spécifiant les mêmes coordonnées et en utilisant les arguments nudge_x et nudge_y pour la décaler légèrement à côté du cercle plein.

g5 <- g4 +
  geom_point(x=6.6436313, y=44.8984037, pch=19, size=3, colour="red")+
  geom_text(aes(x = 6.6436313, y = 44.8984037, label = "Briançon"), nudge_x = 0.2, nudge_y = 0.4)
g5 

Positionner plusieurs lieux

Pour positionner plusieurs lieux, je vous recommande de créer en amont un data frame de 3 colonnes :

  • l’une contenant les étiquettes à afficher (le nom des villes par exemple)
  • l’une contenant la longitude
  • la dernière contenant la latitude

 

Comme cela, par exemple :

df <- data.frame(
  ville = c("Paris", "Bordeaux", "Lyon", "Marseille"),
  longitude = c(2.3522, -0.5792, 4.8357, 5.3698),
  latitude = c(48.8566, 44.8378, 45.7640, 43.2965)
) 

Il ne reste plus qu’à dessiner la carte en ajoutant les lieux. Les positions des cercles pleins et des étiquettes sont spécifiées dans une fonction aes() des couches geom_point() geom_text() afin que les instructions soient appliquées à toutes les lignes (villes) du data frame.


ggplot(data = Fr.reg) +
  geom_sf(fill="lightyellow", colour="purple") +
  geom_point(data=df, 
             aes(x=longitude, y=latitude,colour=ville),
             size=3)+
  scale_colour_manual(values=c("orange", "blue", "magenta", "green3"))+
  geom_text(data=df, 
            aes(x=longitude, y=latitude,colour=ville, 
            label = ville), 
            nudge_x = 0.2, nudge_y = 0.4)+
  theme_void()+
  theme(legend.position = "none")+
  ggtitle("Mes sites")+
  theme(plot.title = element_text(hjust = 0.5, 
                                    size=12, 
                                    color="blue", 
                                    face="bold"))+
  annotation_north_arrow(location = "bl", # bottom left
                         which_north = "true", 
                         style = north_arrow_fancy_orienteering())+
  annotation_scale(location = "br")  

Pour aller plus loin

D’autres packages permettent de positionner des emplacements sur une carte géographique. Si le package ggplot2 ne vous donne pas entière satisfaction, vous pouvez aller jeter un coup d’eoeil du côté des packages tmap (https://cran.r-project.org/web/packages/tmap/vignettes/tmap-getstarted.html), ou encore mapsf (https://riatelab.github.io/mapsf/articles/mapsf.html).

Conclusion

Ce tutoriel visait à vous montrer les étapes nécessaires pour créer facilement une carte géographique avec ggplot2 et ajouter quelques lieux dessus.

Nous avons commencé par l’importation de fonds de carte grâce au package geodata. Ensuite, nous avons abordé la transformation des objets cartographiques en format sf. Cette transformation est cruciale car elle rend les données plus faciles à manipuler dans R. Nous avons encore récupéré les coordonnées géographiques des lieux que nous souhaitions positionner. Et enfin nous avons employé ggplot2 pour dessiner la carte et ajouter les lieux.

 

 N’hésitez pas à laisser un commentaire pour partager votre opinion sur ce tutoriel, poser des questions ou discuter des difficultés que vous rencontrez. Cette interaction enrichit la communauté, et permet à tous de bénéficier de conseils pratiques et de solutions partagées ! 🙏 🫶 

10 réponses

  1. Merci pour ce tuto Claire. <tu peux éventuellement y ajouter l'utilisation de la fonction map_data(), puis de la couche geom_map sur un ggplot ; ça permet de colorer par exemple plusieurs pays sur la carte du monde ou bien plusieurs département sur la carte de France.

  2. Bonjour Claire et merci pour le partage,
    du coup, je me demande s’il est possible (probablement…) de faire apparaître sur la carte des « boules » de taille différentes et/ou de tonalité de couleur afin de décrire par exemple une densité de population ?
    Tu expliques ça dans ta formation ?
    Amicalement
    Philippe

    1. Bonjour Philippe,

      Oui, c’est possible de faire ce type de carte, on les appelle les cartes de symboles proportionnels. Et oui je montre comment faire cela dans la formation.
      Si tu veux prendre un peu d’avance, tu peux jeter un coup d’oeil au package mapsf.
      A bientôt.

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  👇👇👇

Fonctions statistiques R

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.