rCarto, un package de cartographie statistique

Deuxième Rencontres R - Lyon, 27 et 28 juin 2013

Timothée Giraud
UMS RIATE (CNRS)

Quelques solutions générales de cartographie avec R

Sur l'agrégateur "R-bloggers" :

  • Différentes solutions utilisant différents packages.
  • Codes plus ou moins détaillés et accessibles.

Types de cartes :

  • Cartes choroplèthes (en aplats de couleurs)
  • Cartes de symboles (proportionnels ou non)
  • Cartes utilisant des services de cartographie en ligne (OpenStreetMap, Google Maps)
  • Cartes de situation, en raster et d'analyse spatiale

Quelques solutions générales de cartographie avec R

Toutes ces cartes sont globalement construites de la même manière :

  1. Construction d'un jeu de données avec une référence spatiale (coordonnées XY ou identifiant spatial que l'on pourra lier à un fond de carte)
  2. Importation d'un fond de carte
  3. Jointure entre les données et les fonds de carte
  4. Affichage de la carte
  5. Ajout d'un habillage (légende, titre...)

Plusieurs solutions pour les points 1, 2 et 3.
Les points 4 et 5 sont ceux qui peuvent poser problème.

Cadre

Alt text MacEachren, 1994

  • Cartes destinées au public, non à un groupe restreint de personnes ayant connaissance du sujet.
  • Cartes statiques, pas d'interactions pour explorer des vue alternatives
  • Communiquer des résultats ou un message et non mener une analyse exploratoire

Un exemple détaillé

Créer une carte en symboles proportionnels (population par commune):

  1. Création d'un dataframe avec les coordonnées des centroides des communes : coordinates()
  2. Import du fond de carte : readShapeSpatial()
  3. Jointure entre le dataframe des coordonnées des centroides et les données à cartographier : merge()
  4. Affichage de la carte : plot() + symbols()
  5. Ajout d'un habillage
    • Affichage de la légende ("dessin"" dans la zone graphique)
    • Titre et sous titres
# chargement du package rCarto qui contient les données
library(rCarto)
# chargement du package maptools necessaire au traitement des données
# spatiales
library(maptools)
# import du fd de carte
fileShp <- file.path(path.package("rCarto"), "shapes/COMMUNE")
fdc <- readShapeSpatial(fileShp)
# création d'un dataframe avec les coordonnées des centroides des communes
pt <- cbind(fdc@data[, "INSEE_COM"], as.data.frame(coordinates(fdc)))
# renommage des colonnes de ce dataframe
colnames(pt) <- c("Code", "x", "y")
# import des données
data(mtq)
# jointure entre le dataframe des coordonnées des centroides et les
# données à cartographier
pt <- merge(pt, mtq, by.x = "Code", by.y = "ID", all.x = TRUE)
# extension maximale du fond de carte la fonction bbox donne les
# coordonnées max et min du fond de carte
x1 <- bbox(fdc)[1]
y1 <- bbox(fdc)[2]
x2 <- bbox(fdc)[3]
y2 <- bbox(fdc)[4]
# surface maximale de la carte
sfdc <- (x2 - x1) * (y2 - y1)
# somme de la variable à cartographier
sc <- sum(pt$P09_POP, na.rm = TRUE)
# création d'une variable contenant les rayons des cercles à représenter
pt$var <- sqrt((pt$P09_POP * 0.04 * sfdc/sc)/pi)  #la somme des surfaces des cercles
# représentera ici 10% (0.1) de la surface de la carte tri du dataframe de
# manière à ce que les cercles soient dessiner du plus gros au plus petit
pt <- pt[order(pt$var, decreasing = TRUE), ]
# affichage de la carte
plot(fdc, border = "Grey", col = "#FEE08B", ann = FALSE)
symbols(pt[, c("x", "y")], circles = pt$var, add = TRUE, bg = "#CCEBC5", inches = FALSE)
# affichage de la légende (dessin)
rLeg <- quantile(pt$var, c(1, 0.9, 0), type = 1, na.rm = TRUE)
rVal <- quantile(pt$P09_POP, c(1, 0.9, 0), type = 1, na.rm = TRUE)
l <- NA
l$x <- x1
l$y <- y1
xinit <- l$x + rLeg[1]
ypos <- l$y + rLeg
symbols(x = rep(xinit, 3), y = ypos, circles = rLeg, add = TRUE, bg = "#C7E9C0", 
    inches = FALSE)
text(x = rep(xinit, 4) + rLeg[1] * 1.2, y = (l$y + (2 * rLeg)), rVal, cex = 0.7, 
    srt = 0, adj = 0)
for (i in 1:3) {
    segments(xinit, (l$y + (2 * rLeg[i])), xinit + rLeg[1] * 1.1, (l$y + (2 * 
        rLeg[i])))
}
text(x = xinit - rLeg[1], y = (l$y + (2 * rLeg[1])), "Population résidente\n", 
    adj = c(0, 0), cex = 0.7)
# titre et sous titres
title(main=paste("Répartition de la population\nen Martinique"),#
      sub="Auteur: T. Giraud, UMS RIATE, 2013\nSource: INSEE, 2012 et IGN, 2012", cex.sub=0.8)

plot of chunk unnamed-chunk-5

Le package rCarto

library(rCarto)
data(mtq)
fileShp <- file.path(path.package("rCarto"), "shapes/COMMUNE")
mapCircles(shpFile = fileShp, shpId = "INSEE_COM", df = mtq, dfId = "ID", var = "P09_POP")

Alt text

Le package rCarto

mapCircles(shpFile=fileShp,                                    # chemin du shapefile
           shpId="INSEE_COM",                                  # champ des identifiants du shapefile
           df=mtq,                                             # nom du dataframe
           dfId="ID",                                          # champ des identifiants du dataframe
           var="P09_POP",                                      # variable à représenter
           shareOfCircle=0.1,      # part de la surface de la carte occupée par les cercles 
           posLeg="topright",                                  # position de la légende
           circleCol="tan1",                                   # couleur des cercles
           baseCol="honeydew",                                 # couleur du fond de carte
           title="Distribution de la population\nen Martinique", # titre  de la carte
           legend="Population\nrésidente en 2009",             # titre de la légende
           author=Sys.getenv("USERNAME"),                      # auteur ou autre texte
           sources="Données : INSEE, 2009 ; fond de carte : IGN, 2012", # source ou autre texte
           scalebar=TRUE,                                      # échelle  
           scalebarSize=5000,                                  # taille de l'echelle
           scalebarText="5 km",                                # texte de l'échelle
           northArrow=TRUE,                                    # flèche nord
           northArrowSize=5000)                                # taille de la flèche nord  

Le package rCarto

Carte en symboles proportionnels

Alt text

Le package rCarto

Carte en symboles proportionnels

  • Possibilité de fixer la taille et la valeur du plus grand cercle
mapCircles(...
           fixedNorm=TRUE,
           radiusMax=1,
           valueMax=20000,
           ...)
  • Possibilité de modifier la position de la légende
mapCircles(...
           posLeg="bottomleft",
           ...)

Le package rCarto

Carte en symboles proportionnels

Alt text Alt text

Le package rCarto

Carte Choroplèthe

# calcul de la part des moins de 15 ans dans la population
mtq$pct0014_09 <- mtq$P09_POP0014/mtq$P09_POP*100 
# cartographie de la part des moins de 15 ans
mapChoropleth(shpFile=file.path(path.package("rCarto"), "shapes/COMMUNE"),#
              shpId="INSEE_COM",df=mtq,dfId="ID",var="pct0014_09",
              style="quantile",nclass=6,
              lgdRnd=1,
              palCol="Greens",
              title="Part des jeunes dans\nla population en Martinique",  
              legend="Part des 0-14 ans\ndans la population total\nen2009",
              author="Discrétisation : effectifs égaux",
              sources="Auteur : T. Giraud - Sources : INSEE, 2009 ; IGN, 2012",
              scalebar=TRUE,scalebarSize=5000,scalebarText="5 km",
              northArrow=TRUE,northArrowSize=5000)

Le package rCarto

Carte Choroplèthe

Alt text

Le package rCarto

Carte Choroplèthe - différentes discrétisations

Alt text Alt text Alt text

Le package rCarto

# calcul du taux de croissance annuel moyen de la population
mtq$POPVAR <- (((mtq$P09_POP/mtq$P99_POP)^(1/10)) - 1) * 100
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  -2.570  -0.521   0.418   0.458   1.060   4.430

plot of chunk unnamed-chunk-13

# calcul manuel des bornes de la discrétisation (basée sur la moyenne et 
# l'écart-type, avec la moyenne comme centre de classe et l'écart-type comme étendue)
brks <- mean(mtq$POPVAR)+c(4.5,3.5,2.5,1.5,0.5,-0.5,-1.5,-2.5,-3.5,-4.5)*sd(mtq$POPVAR)
listBrks <- c(max(mtq$POPVAR),brks[brks>min(mtq$POPVAR)&brks<max(mtq$POPVAR)],min(mtq$POPVAR))
nbclass <- length(listBrks)-1

mapChoropleth(shpFile=file.path(path.package("rCarto"), "shapes/COMMUNE"),#
              shpId="INSEE_COM",df=mtq,dfId="ID",var="POPVAR",
              fixBrks=TRUE,listBrks=listBrks,
              diverg=TRUE,divergBrk=mean(mtq$POPVAR),
              lgdRnd=2,posLeg="bottomleft",
              palColPos="Greens",palColNeg="Blues",NACol="grey",
              title="Dynamique de la population\nen Martinique",  
              legend="Taux de croissance\nannuel moyen de la\npopulation (1999-2009)",
              author=Sys.getenv("USERNAME"),
              sources="Données : INSEE, 2009 ; fond de carte : IGN, 2012",
              scalebar=TRUE,scalebarSize=5000,scalebarText="5 km",
              northArrow=TRUE,northArrowSize=5000)

Le package rCarto

Carte Choroplèthe

Alt text

Le package rCarto

Carte de cercles proportionnels à une variable de stock et colorés selon la discrétisation d’une variable quantitative

mapCirclesChoro(shpFile=file.path(path.package("rCarto"), "shapes/COMMUNE"),#
                shpId="INSEE_COM",df=mtq,dfId="ID",var2="POPVAR",var="P09_POP",
                shareOfCircle=0.1,
                lgdRndCircles=0,
                fixBrks=TRUE,listBrks=listBrks,
                diverg=TRUE,divergBrk=mean(mtq$POPVAR),palColPos="Greens",
                title="Dynamique de la population\nen Martinique",
                legendCircles="Population résidente\nen 2009",
                legendDistr="Taux de croissance\nannuel moyen de la\npopulation (1999-2009)",
                author=Sys.getenv("USERNAME"),
                sources="Données : INSEE, 2009 ; fond de carte : IGN, 2012",
                scalebar=TRUE,scalebarSize=5000,scalebarText="5 km",
                northArrow=TRUE,northArrowSize=5000)

Le package rCarto

Carte de cercles proportionnels à une variable de stock et colorés selon la discrétisation d’une variable quantitative

Alt text

Le package rCarto

Carte choroplèthe colorée selon les modalités d’une variable qualitative

# classification des communes en fonction de leur accès aux plages
mtq[c(1,12,18,23,33,8,24),"beach"] <- "Pas d'accès aux plages"
mtq[c(2,4,5,6,9,13,17,20,21,25,26,29,
      31,34,11,27,7,19),"beach"]<-"Mer des Antilles"
mtq[c(14,5,16,22,28,30,32,10,3),"beach"] <- "Ocean Atlantique"
mtq[c(26,17,11),"beach"] <- "Accès aux deux mers"

# carte représentant des données qualitatives - Accès aux plages
mapChoroTypo(shpFile=file.path(path.package("rCarto"), "shapes/COMMUNE"),#
             shpId="INSEE_COM",df=mtq,dfId="ID",var="beach",posLeg="bottomleft", 
             title="Accès aux plages martiniquaises",legend="Quel accès?",
             palCol="Set1",
             author=Sys.getenv("USERNAME"),
             sources="Données : l'auteur ; fond de carte : IGN, 2012",
             scalebar=TRUE,scalebarSize=5000,scalebarText="5 km",
             northArrow=TRUE,northArrowSize=5000)

Le package rCarto

Cartes choroplèthes colorées selon les modalités d’une variable qualitative

Alt text

Le package rCarto

Carte de cercles proportionnels à une variable de stock et colorés selon les modalités d’une variable qualitative

mapCirclesTypo(shpFile=file.path(path.package("rCarto"), "shapes/COMMUNE"),#
               legendTypo="Quel accès?",
               shpId="INSEE_COM",df=mtq,dfId="ID",var2="beach", var="P09_POP",
               shareOfCircle=0.1,
               lgdRndCircles=0,
               legendCircles="Population résidente\nen 2009",
               title="Accès aux plages martiniquaises",
               palCol="Set1",
               author=Sys.getenv("USERNAME"),
               sources="Données : l'auteur et INSEE, 2009 ; fond de carte : IGN, 2012",
               scalebar=TRUE,scalebarSize=5000,scalebarText="5 km",
               northArrow=TRUE,northArrowSize=5000)

Le package rCarto

Cartes de cercles proportionnels à une variable de stock et colorés selon les modalités d’une variable qualitative

Alt text

Le package rCarto

Perspectives

  • placements automatiques de l'echelle et de la flèche nord
  • cartes en aplats + cercles
  • possibilité de représenter des variables de stock négatives et positives
  • une option "label"
  • des options d'exportation
  • des cartes de flux
  • ajouts de couches d'habillage
  • choix du type d'implantation de la variable (surface ou point)
  • ...

Merci de votre attention!