Making maps with R: become a mappeR

Corentin Visée

Pourquoi faire des cartes ?

  • La communication des résultats est un aspect important et satisfaisant de la recherche géographique.

  • En plus d’être amusante et créative, la cartographie a également d’importantes applications pratiques.

  • Une carte soigneusement conçue peut être le meilleur moyen de communiquer les résultats de votre travail, mais des cartes mal conçues peuvent laisser une mauvaise impression.

  • Les cartes sont aussi souvent le meilleur moyen de présenter les résultats de la recherche géoinformatique d’une manière accessible.

Comment faire des cartes avec R ?

  • Avec quelques packages !
  • Pour installer tmap:
install.packages("tmap", 
                 repos = c("https://r-tmap.r-universe.dev", 
                           "https://cloud.r-project.org"))
  • Pour tout charger :
library(tidyverse) # for data wrangling
library(tmap) # for making our maps
library(terra) # handle raster and vector data
library(geodata) # get all kind of shp and raster dataset 

Les données

  • Limites administratives du Sénégal au niveau 1

  • Altitude pour le Sénégal

  • Densité de la population du Sénégal d’après GPW 2020

admin_senegal <- gadm(country = "Senegal", level = 1, path = "Data/") # charge l'unité administrative de niveau 1
elev_senegal <- elevation_30s(country = "Senegal", path = "Data/") # charge les données d'élévation pour le pays

Pourquoi pas plot et ggplot2?

  • Plot :

    • Pas facile d’ajouter beaucoup d’informations (raster / vecteur)

    • Pas facile de gérer les légendes

  • Ggplot2 :

    • Conçu pour créer des graphes 2D, pas des cartes

    • Parfois pas très pratique pour créer des cartes avec des rasters

Comment cartographier les limites administratives ?

  • Comment ajouter des couleurs ?
plot(x = admin_senegal)

Comment cartographier l’élévation ?

  • Comment gérer la légende ?
plot(x = elev_senegal)

Nous sommes prêts pour tmap

  • Tmap a la même stratégie que QGIS

    • Couches

    • Lasagna way of doing the map

  • Pour une carte basique de tmap :

    tm_shape(shp = admin_senegal) +
        tm_polygons() 

Et ?

  • Vous pouvez ajouter ce que vous voulez sur votre carte, dessiner seulement les lignes (bordures des unités administratives) ou les polygones !
tm_shape(shp = admin_senegal) +
    tm_borders()

tm_shape(shp = admin_senegal) +
    tm_polygons()

Comment ajouter des couleurs ?

  • Pour ajouter de la couleur, vous avez besoin du nom de la colonne sur laquelle vous voulez mettre de la couleur : argument fill

  • Fournir le type d’échelle que vous souhaitez : argument fill.scale

  • Fournir un titre pour la légende : argument fill.legend

    tm_shape(shp = admin_senegal) +
        tm_polygons(fill = "NAME_1", 
                    fill.legend = tm_legend(title = "Régions du Sénégal"), 
                    fill.scale = tm_scale_categorical())

Comment travailler avec des rasters ?

  • De la même façon !

  • Vous devez indiquer le type de palette de couleurs que vous souhaitez (continu, intervalles, …) : argument col.scale

    • Attention à l’argument label.format
tm_shape(shp = elev_senegal) +
    tm_raster(col.scale = tm_scale_intervals(style = "quantile", 
                                             midpoint = 0, 
                                             label.format = list(scientific =  T, 
                                                                 format = "f")), 
              col.legend = tm_legend(title = "Elevation (m)"))
  • Ceci constituera la base du code pour toutes les cartes que vous ferez !

Voilà !

tm_shape(shp = elev_senegal) +
    tm_raster(col.scale = tm_scale_intervals(style = "quantile", 
                                             midpoint = 0, 
                                             label.format = list(scientific =  T, 
                                                                 format = "f")), 
              col.legend = tm_legend(title = "Elevation (m)"))

Mais, c’est moche !

  • Nous pouvons habiller notre carte avec différents éléments

    • un graticule : tm_graticules

    • une échelle : tm_scalebar

    • une flèche du nord : tm_compass

    • un histogramme de distribution des valeurs : tm_chart_histogram

    • les crédits de la carte : tm_credits

    • un fond de carte : tm_basemap

Le résultat !

tm_shape(shp = elev_senegal) +
    tm_raster(col.scale = tm_scale_intervals(style = "quantile", 
                                             midpoint = 0, 
                                             label.format = list(scientific =  T, 
                                                                 format = "f")), 
              col.legend = tm_legend(title = "Elevation (m)"), 
              col.chart = tm_chart_histogram()) +
    tm_graticules(lines = F) +
    tm_scalebar(position = c("TOP", "RIGHT")) +
    tm_compass(position = c("TOP", "LEFT")) +
    tm_credits(text = "GADM & SRTM", position = c("BOTTOM", "RIGHT")) +
    tm_basemap()

Pour une carte complète !

  • Nous pouvons ajouter des données vecteurs et des données rasters en même temps ! ;)

    tm_shape(shp = elev_senegal) +
        tm_raster(col.scale = tm_scale_intervals(style = "quantile", 
                                                 midpoint = 0, 
                                                 label.format = list(scientific =  T, 
                                                                     format = "f")), 
                  col.legend = tm_legend(title = "Elevation (m)"), 
                  col.chart = tm_chart_histogram()) +
        tm_shape(shp = admin_senegal) +
        tm_polygons() +
        tm_graticules(lines = F) +
        tm_basemap()

  • wouuuuuups, que s’est-il passé ?

La bonne méthode

tm_shape(shp = elev_senegal) +
    tm_raster(col.scale = tm_scale_intervals(style = "quantile", 
                                             midpoint = 0, 
                                             label.format = list(scientific =  T, 
                                                                 format = "f")), 
              col.legend = tm_legend(title = "Elevation (m)"), 
              col.chart = tm_chart_histogram()) +
    tm_shape(shp = admin_senegal) +
    tm_borders(col = "black") +
    tm_graticules(lines = F) +
    tm_basemap()

Pas convaincu par la suprématie de R?

  • Supposons que nous voulions une carte pour chaque unité administrative, comment pourrions-nous le faire ?
tm_shape(shp = elev_senegal) +
    tm_raster(
        col.scale = tm_scale_intervals(
            style = "quantile",
            midpoint = 0,
            label.format = list(scientific =  T, format = "f")
        ),
        col.legend = tm_legend(title = "Elevation (m)"),
        col.chart = tm_chart_histogram()
    ) +
    tm_shape(shp = admin_senegal, is.main = T) +
    tm_borders(col = "black") +
    tm_facets(by = "NAME_1") +
    tm_graticules(lines = F) +
    tm_basemap()

Pour le rapport

  • Faire des chouettes cartes avec les données de population pour d’autres pays !

  • Essayer d’autres styles de légende :

    • tm_scale_continuous
    • Essayer d’autres styles dans tm_scale_intervals
      • quantile

      • sd

      • equal

  • Utilise la commande suivante tmap_mode("view") et refaire une carte.

    • Que se passe-t-il ?