Créer des cartes reproductibles avec mapsf

Timothée Giraud - UMS RIATE (CNRS, Université de Paris)

Les lundis de l’Ined - 2021/11/08

La recherche reproductible

Au coeur de la méthode scientifique

  • Les sciences se reposent sur le principe de reproductibilité.

  • La reproductibilité est un élément permettant d’évaluer la validité des résultats.

Le spectre de la reproductibilité

@peng2011reproducible

Peng (2011)

Accompagner les publications scientifiques des jeux de données et codes sources pour permettre aux collègues de reproduire les résultats.

La cartographie reproductible

Les cartes, comme les autres productions graphiques ou statistiques sont des éléments à parts entières des études scientifiques.

La plupart des cartes produites dans un contexte académique sont issues de processus complexes.
Elles sont souvent produites en utilisant une grande variété de logiciels et de formats.

Cette variété de formats et de logiciels rend difficile la reproduction des cartes.

@giraudlambert

Giraud and Lambert (2017)

Simplifier les chaines de traitement pour couvrir les différentes étapes de la construction cartographique.

R et son écosystème spatial

  • R est un langage et un environnement permettant de réaliser des traitements statistiques et de représentations graphiques.

  • R est un logiciel libre sous license GNU General Public License.

  • R est multiplateforme (GNU/Linux, Windows, OS X…).

Autour de R

  • Un large ecosystème de packages créés par les contributeurs.

  • RStudio, un environnement de développement intégré.

  • Une solution de literate programming basée sur le langage Markdown.

  • Des logiciels de gestion de version (git).

sf, pierre angulaire de l’écosystème spatial de R

@pebesma

Pebesma and Bivand (2020)

sf, les fonctionnalités d’un SIG

  • Import / Export de données spatiales (vectorielles)
  • Affichage
  • Gestion des systèmes de coordonnées (les projections)
  • Sélections spatiales (intersects, within, contains… )
  • Opérations sur les géométries (zone tampon, centroïdes, agrégations, intersections, découpages…)
  • Mesures (longueurs, distances, surfaces)

Mais les fonctionnalités cartographiques de sf sont limitées.

Le package mapsf

Chaîne de traitement typique

Chaîne de traitement typique

mf_map()

mf_map() est la fonction principale du package.

mf_map(x = objet_sf,
var = "variable",
type = "type de représentation",
...)
?mapsf

?mapsf

9 types de carte

Vignette : Get started

Habillage

Exemple

  • Affichage du fond de carte :
mtq <- mf_get_mtq()
# Plot the base map
mf_map(x = mtq)

  • Affichage d’une carte choroplèthe avec les paramètres par défaut :
mtq <- mf_get_mtq()
# Plot a choropleth map
mf_map(x = mtq, var = "MED", type = "choro")

  • Personnalisation des paramètres de la représentation
mtq <- mf_get_mtq()
# Plot a choropleth map
mf_map(x = mtq, var = "MED", type = "choro",
       pal = "Dark Mint",
       breaks = "quantile",
       nbreaks = 6,
       leg_title = "Median Income\n(euros)",
       leg_val_rnd = -2,
       leg_pos = "topright")

  • Ajout d’éléments d’habillage
mtq <- mf_get_mtq()
# Plot a choropleth map
mf_map(x = mtq, var = "MED", type = "choro",
       pal = "Dark Mint",
       breaks = "quantile",
       nbreaks = 6,
       leg_title = "Median Income\n(euros)",
       leg_val_rnd = -2,
       leg_pos = "topright")
# Plot a layout elements
mf_title("Wealth in Martinique, 2015")
mf_credits("T. Giraud\nSources: INSEE & IGN, 2018")
mf_scale(size = 5)
mf_arrow('topleft')

  • Utilisation d’un thème
mtq <- mf_get_mtq()
# Start a map using a theme
mf_init(x = mtq, theme = "dark")
# Plot a choropleth map
mf_map(x = mtq, var = "MED", type = "choro",
       pal = "Dark Mint",
       breaks = "quantile",
       nbreaks = 6,
       leg_title = "Median Income\n(euros)",
       leg_val_rnd = -2,
       leg_pos = "topright",
       add = TRUE)
# Plot a layout elements
mf_title("Wealth in Martinique, 2015")
mf_credits("T. Giraud\nSources: INSEE & IGN, 2018")
mf_scale(size = 5)
mf_arrow('topleft')

  • Ajout d’un ombrage
mtq <- mf_get_mtq()
# Start a map using a theme
mf_init(x = mtq, theme = "dark")
# Plot a shadow
mf_shadow(mtq, col = "grey10", add = TRUE)
# Plot a choropleth map
mf_map(x = mtq, var = "MED", type = "choro",
       pal = "Dark Mint",
       breaks = "quantile",
       nbreaks = 6,
       leg_title = "Median Income\n(euros)",
       leg_val_rnd = -2,
       leg_pos = "topright",
       add = TRUE)
# Plot a layout elements
mf_title("Wealth in Martinique, 2015")
mf_credits("T. Giraud\nSources: INSEE & IGN, 2018")
mf_scale(size = 5)
mf_arrow('topleft')

  • Ajout d’un carton de localisation
mtq <- mf_get_mtq()
# Start a map using a theme
mf_init(x = mtq, theme = "dark")
# Plot a shadow
mf_shadow(mtq, col = "grey10", add = TRUE)
# Plot a choropleth map
mf_map(x = mtq, var = "MED", type = "choro",
       pal = "Dark Mint",
       breaks = "quantile",
       nbreaks = 6,
       leg_title = "Median Income\n(euros)",
       leg_val_rnd = -2,
       leg_pos = "topright",
       add = TRUE)
# Add an inset world map
mf_inset_on(x = "worldmap", pos = "right")
mf_worldmap(mtq, col = "#0E3F5C")
mf_inset_off()
# Plot a layout elements
mf_title("Wealth in Martinique, 2015")
mf_credits("T. Giraud\nSources: INSEE & IGN, 2018")
mf_scale(size = 5)
mf_arrow('topleft')

  • Extension des marges de la figure sur la droite
mtq <- mf_get_mtq()
# Start a map using a theme and extra margins
mf_init(x = mtq, theme = "dark",
        expandBB = c(0,0,0,.3))
# Plot a shadow
mf_shadow(mtq, col = "grey10", add = TRUE)
# Plot a choropleth map
mf_map(x = mtq, var = "MED", type = "choro",
       pal = "Dark Mint",
       breaks = "quantile",
       nbreaks = 6,
       leg_title = "Median Income\n(euros)",
       leg_val_rnd = -2,
       leg_pos = "topright",
       add = TRUE)
# Add an inset world map
mf_inset_on(x = "worldmap", pos = "right")
mf_worldmap(mtq, col = "#0E3F5C")
mf_inset_off()
# Plot a layout elements
mf_title("Wealth in Martinique, 2015")
mf_credits("T. Giraud\nSources: INSEE & IGN, 2018")
mf_scale(size = 5)
mf_arrow('topleft')

Création de cartons

Vignette : How to Create Inset Maps

  • Avec un objet géographique
mf_map(mtq)
mf_inset_on(x = mtq[1, ], 
            cex = .3)
mf_map(mtq[1, ])
mf_inset_off()









  • Avec une carte de localisation
mf_map(mtq)
mf_inset_on(x = "worldmap", 
            pos = "bottomleft")
mf_worldmap(x = mtq)
mf_inset_off()









  • Encart non cartographiques

Thèmes

Vignette : How to Use Themes

Raster

library(maptiles)
mtq <- st_transform(mtq, 3857)
osm <- get_tiles(
  mtq, 
  provider = "Stamen.TerrainBackground", 
  crop= TRUE, 
  zoom = 11
)
th <- mf_theme(
  x = "default", bg = "#99b3cc", 
  inner = TRUE, line = 1.5, cex = 1, 
  pos = "right", mar = c(0,0,0,0)
)
mf_export(x = osm, filename = "img/osm.png", 
          width = 672, theme = th, res = 150)
mf_raster(osm)
mf_map(mtq, col = NA, add = TRUE)
mf_scale()
mf_title("mf_raster()")
mf_credits(get_credit("Stamen.TerrainBackground"))
dev.off()

Nouveau

library(mapsf)
mtq <- mf_get_mtq()
mf_init(mtq, theme = "default")
mf_background("img/blackboard.jpg")
mf_map(mtq, lwd = 3, col = NA,
       border = "white", add = TRUE)
mf_credits(
  txt = "Photo by Noita Digital on Unsplash",
  col = "white"
)
mf_title("mf_background()")

Développement

Un nombre minimal de dépendances solides.

Merci

Site web du package

sessionInfo()

## R version 4.1.1 (2021-08-10)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Debian GNU/Linux 11 (bullseye)
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0
## 
## locale:
##  [1] LC_CTYPE=fr_FR.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=fr_FR.UTF-8        LC_COLLATE=fr_FR.UTF-8    
##  [5] LC_MONETARY=fr_FR.UTF-8    LC_MESSAGES=fr_FR.UTF-8   
##  [7] LC_PAPER=fr_FR.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=fr_FR.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] mapsf_0.3.0 sf_1.0-3   
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_1.0.7         bslib_0.3.1        compiler_4.1.1     pillar_1.6.4      
##  [5] jquerylib_0.1.4    highr_0.9          rmdformats_1.0.3   class_7.3-19      
##  [9] tools_4.1.1        digest_0.6.28      tibble_3.1.5       jsonlite_1.7.2    
## [13] evaluate_0.14      lifecycle_1.0.1    pkgconfig_2.0.3    rlang_0.4.12      
## [17] DBI_1.1.1          yaml_2.2.1         xfun_0.27          fastmap_1.1.0     
## [21] e1071_1.7-9        s2_1.0.7           stringr_1.4.0      dplyr_1.0.7       
## [25] knitr_1.36         generics_0.1.1     sass_0.4.0         vctrs_0.3.8       
## [29] tidyselect_1.1.1   classInt_0.4-3     grid_4.1.1         glue_1.4.2        
## [33] R6_2.5.1           jpeg_0.1-9         fansi_0.5.0        rmarkdown_2.11    
## [37] bookdown_0.24      purrr_0.3.4        magrittr_2.0.1     codetools_0.2-18  
## [41] htmltools_0.5.2    ellipsis_0.3.2     units_0.7-2        assertthat_0.2.1  
## [45] utf8_1.2.2         KernSmooth_2.23-20 stringi_1.7.5      proxy_0.4-26      
## [49] wk_0.5.0           crayon_1.4.1

References

Giraud, Timothée, and Nicolas Lambert. 2017. “Reproducible Cartography.” In Advances in Cartography and GIScience, edited by Michael P. Peterson, 173–83. Cham: Springer International Publishing.
Pebesma, Edzer, and Roger Bivand. 2020. “R Spatial Follows GDAL and PROJ Development.” https://r-spatial.org/r/2020/03/17/wkt.html.
Peng, Roger D. 2011. “Reproducible Research in Computational Science.” Science 334 (6060): 1226–27.