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')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 :
- carte de localisation avec des labels
- carte choroplèthe pour une variable quantitative
- carte en cercles proportionnels pour une variable quantitative de stock
- carte pour un raster discret
- carte pour un raster continu
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.
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()
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à.