Cartographie thématique

Objectifs du quatrième volet

Ce quatrième volet présente quelques fonctionnalités de mise en page cartographique thématique avec R, aussi bien en vecteur qu’en raster. Nous utiliserons principalement la librairie mapsf, développée par l’UAR RIATE du CNRS. Commencez par installer cette librairie si ce n’est déjà fait. À l’issue de ce cinquième volet, vous serez capables de réaliser les cartes suivantes :

Vous pouvez revoir les conventions de sémiologie graphique dans vos cours ou en ligne, notamment sur le site de Boris Mericskay.

Données à représenter

Nous allons tour à tour représenter les données démographiques (population, densité) que nous avons exploré précédemment. Concernant le raster, nous nous focaliserons sur l’occupation du sol et la topographie. Nous commençons par charger les couches dont nous aurons besoin, si elles ne sont pas déjà chargées.

library(terra)
# les départements avec les populations et les densités
dep_pop <- vect('./Data_processed/dep_France_pop.gpkg')
# les principaux cours d'eau
hydro <- vect('./Data/hydro_France.gpkg')
# le MNT
mnt <- rast('./Data/MNT_GTopo.tif')
# l'occupation du sol du département 58
occ_sol_58 <- rast('./Data_processed/occ_sol_58.tif')

Carte de localisation

Pour commencer nous allons simplement cartographier les départements avec leurs labels. La librairie mapsf, pour le vecteur, ne gère que le format sf. Il est donc nécessaire de transformer nos objets vecteurs terra en objet sf. Heureusement cela se fait très simplement.

library(mapsf)
library(sf)
# conversion de nos départements en objet sf
dep_pop_sf <- st_as_sf(dep_pop)

# définition des sources
credits <- paste0("Sources: IGN, 2020\n", "mapsf ", packageVersion("mapsf"))

# carto des départements
mf_map(dep_pop_sf, col = "#e4e9de", border = "darkseagreen4") # définition du style
# affichage des labels
mf_label(
  x = dep_pop_sf,                                # la couche à représenter
  var = "NOM_DEPT",                              # le champ contenant les labels
  cex = 0.5,
  font = 4,                                      # la taille des labels
  halo = TRUE,                                   # mettre un halo autour des labels
  r = 0.1,
  overlap = FALSE,                               # ne pas autoriser le chevauchement des labels
  q = 3,
  lines = FALSE
)
# habillage
mf_title("Les départemens de France hexagonale") # le titre de la carte
mf_credits(credits)                              # inclusion des crédits
mf_arrow(pos = "topright")                       # flèche du nord en haut à droite
mf_scale()                                       # ajout d'une barre d'échelle

Lorsque la carte est petite, l’aspect peut paraître chargé.

Nous pouvons inclure un cartouche de localisation (appelé inset) dans notre carte pour une touche pro. Nous pouvons y mettre une couche de notre choix, mais nous mettrons ici un cartouche prédéfini dans le package représentant un globe et la localisation dessus.

# carto des départements
mf_map(dep_pop_sf, col = "#e4e9de", border = "darkseagreen4")
# affichage des labels
mf_label(
  x = dep_pop_sf,
  var = "NOM_DEPT",
  cex = 0.5,
  font = 4,
  halo = TRUE,
  r = 0.1,
  overlap = FALSE,
  q = 3,
  lines = FALSE
)
# habillage
mf_title("Les départemens de France hexagonale (avec un joli cartouche)")
mf_arrow(pos = "topright")
mf_scale()
mf_inset_on(x = "worldmap", pos = "bottomleft") # définition de l'inset
mf_worldmap(x = dep_pop_sf)                     # on centre l'inset sur notre couche
mf_inset_off()

Carte choroplèthe

Nous allons maintenant cartographier les densités de populations départementales. Il s’agit d’une variable quantitative de rapport. Nous allons donc utiliser des aplats et une variation de teintes de couleur.

# cartographie des densités de population par département
mf_map(
  x = dep_pop_sf,                               # la couche à cartographier
  var = "densite_hab",                          # le champ à représenter
  type = "choro",                               # une carte choroplèthe est demandée
  breaks = "geom",                              # méthode de discrétisation
  nbreaks = 5,                                  # nombre de classes
  pal = "Teal",                                 # la palette à utiliser
  border = "white",                             # couleur des bordures de département
  lwd = 0.5,                                    # épaisseur des bordures
  leg_pos = "bottomleft",                       # position de la légende
  leg_adj = c(0, 3),
  leg_title = "Desnité de pop.\n(hab. / km2)"   # titre de la légende
)
# habillage
mf_title("Des départements de densités très variées")
mf_credits(credits)
mf_arrow()
mf_scale()

Carte en cercles proportionnels

Nous allons maintenant représenter le nombre d’habitants par département. Nous avons maintenant affaire à une variable quantitative de stock. Nous allons donc utiliser le cercle proportionnel.

# cartographie des populations départementales
mf_map(dep_pop_sf)
mf_map(
  x = dep_pop_sf,                          # la couche à cartographier
  var = "Population_dep",                  # le champ à représenter
  type = "prop",                           # les cercles proportionnels sont demandés
  inches = 0.2,                            # la taille du plus petit cercle
  col = "brown4",                          # la couleur des cercles
  leg_pos = "topright",                    # la position de la légende
  leg_adj = c(0, -3),
  leg_title = "Nb d'habitants"             # le titre de la légende
)
# habillage
mf_title("Des départements inégalement peuplés")
mf_credits(credits)
mf_arrow()
mf_scale()

À vous de jouer

Produisez ces trois cartes pour une région de votre choix.

Carte de raster continu

Par raster continu, nous entendons des rasters dont les valeurs sont continues, comme des valeurs d’altitude, de température, de NDVI… Pour cartographier ce type de rasters, nous pouvons rester dans la librairie terra. Nous allons ici représenter la topographie du territoire métropolitain.

# cartographie de la topographie
plot(mnt,                                     # le raster à représenter
     col=gray.colors(100),                    # la palette de couleurs (ici teintes de gris)
     main='Topographie de la France',         # titre de la carte
     plg=list(                                # paramètres pour la légende
        title = "Altitude (m)",               # titre de la légende
        title.cex = 1.2,                      # taille du titre de la légende
        cex = 1)                              # taille du texte de la légende
    )
# ajout d'une flèche du nord
terra::north()
# ajout d'une barre d'échelle (avec une distance de 250 km) et le label qui va bien
terra::sbar(d = 250,
     label = c("250 km")
)

Nous pouvons changer la palette de couleurs et utiliser celle dédiée à l’altitude, nommée elevation.

# cartographie de la topographie
plot(mnt,                                     # le raster à représenter
     col=map.pal("elevation"),                # la palette de couleurs (ici elevation)
     main='Topographie de la France',         # titre de la carte
     plg=list(                                # paramètres pour la légende
        title = "Altitude (m)",               # titre de la légende
        title.cex = 1.2,                      # taille du titre de la légende
        cex = 1)                              # taille du texte de la légende
    )
# ajout d'une flèche du nord
terra::north()
# ajout d'une barre d'échelle (avec une distance de 250 km) et le label qui va bien
terra::sbar(d = 250,
     label = c("250 km")
)

Il serait possible de peaufiner sa palette de couleurs afin d’avoir un rendu moins flashy.

Il est possible d’ajouter sur notre carte des données vecteur. Nous allons par exemple ajouter les principaux cours d’eau à notre carte.

# cartographie de la topographie avec les cours d'eau
plot(mnt,
     col=gray.colors(100),
     main='Topographie et hydrographie (France)', 
     plg=list(
        title = "Altitude (m)",
        title.cex = 1.2,
        cex = 1),
     background = "lightblue"  # ajout d'un joli fond bleu clair
    )
lines(hydro,            # ajout des cours d'eau
      col='#088cf3',    # définition de la couleur en hexadecimal
      lwd=0.7)          # épaisseur des lignes
north()
sbar(d = 250,
     label = c("250 km")
)

Il est normalement possible d’ajouter une légende avec la couche vecteur qui vient d’être ajoutée mais le réglage n’est pas si simple.

Carte de raster discret

Par raster discret, nous entendons un raster dont les valeurs ne peuvent prendre qu’une certaine gamme. C’est le cas des rasters d’occupation du sol par exemple. Nous allons ici cartographier l’occupation du sol pour le département de la Nièvre.

# récupération des limites du département choisi
dep_58 <- dep_pop[dep_pop$CODE_DEPT == '58', ]

# définition des noms des classes d'occupation du sol (dans l'ordre des ID de classe)
# seules les classes en effet présentes sur notre raster sont choisies
noms_classes <- c("Espace boisé", "Broussailles", "Prairie", "Culture", "Bâti",
                  "Sol nu/Vég. éparse", "Eau", "Zone humide")

# définition des couleurs pour chaque classe dans (dans l'ordre des id de classe)
pal_col <- c("#006400",
             "#ffbb22",
             "#ffff4c",
             "#f096ff",
             "#fa0000",
             "#b4b4b4",
             "#0064c8",
             "#0096a0")

# association des noms de classes à leurs ID
levels(occ_sol_58) <- data.frame(c(10, 20, 30, 40, 50, 60, 80, 90), 
                                 classe = noms_classes)

# création de la carte
plot(occ_sol_58,                              # le raster à cartographier
     col = pal_col,                           # la palette de couleurs à utiliser
     type = "classes",                        # on veut une carte en catégories
     main = "L'agriculture domine la Nièvre", # titre de la carte
     axes = FALSE,                            # on n'affiche pas les axes du Lambert 93
     legend = TRUE,
     # définition de la légende
     plg = list(title = "Occupation du sol",  # titre de la légende
                cex = 1,                      # taille du texte
                x = "bottomright",            # position de la légende
                bg = "#eaeae",                # couleur du background (ne fonctionne pas ??)
                box.col = "black"))           # couleur du cadre (ne fonctionne pas ??)
lines(dep_58,                                 # ajout des contours du département
      col='#eaeaea',                          # la couleur des contours en hexadécimal
      lwd=3)                                  # épaisseur des contours
north()
sbar(d = 20000,
     label = c("20 km")
     )

Le rendu est perfectible, l’option de la couleur du background de la légende ne semble pas fonctionner… mais l’essentiel est là.