Comment faire un carton avec R?

Comme le dit Wikipédia :
« En cartographie, un carton est une petite carte complémentaire d’une carte principale, insérée dans la même page. »

Dans ce post je propose une solution pour créer des cartons cartographique en utilisant le package cartography. J’en profite pour introduire la fonction getFigDim qui aide à choisir les dimensions d’une figure lors de son export.

Les données

J’ai construit un fichier des pays visités par James Bond de 1962 à 2015 (24 films). L’objectif de la carte sera de montrer le nombre de fois ou 007 s’est rendu dans chaque pays.

# Démarrer le package cartography
library(cartography)
# Charger les données stockées sur le web
load((url("http://wukan.ums-riate.fr/bond/bondfiles.RData")))
head(BondVisits)

Le data frame BondVisits contient 2 colonnes, l’identifiant des pays (ISO2) et le nombre de visites (n).

La carte

Le code suivant créé une carte des pays visités.

# Gestion des marges de la figure
par(mar = c(0,0,1.2,0))

# Centrer la carte sur Russie, Nouvelle Zélande et Argentine 
plot(WorldCountries[WorldCountries$ISO3 %in% c( "RUS","NZL","ARG"),],  
     border = NA,
     bg = "#cdd2d4")

# Afficher les pays
plot(WorldCountries, col = "#f5f5f3ff", border = "#a9b3b4ff",
     add = T)

# Afficher les cercles proportionnels
propSymbolsLayer(spdf = WorldCountries, df = BondVisits,
                 var = "n", legend.pos = "left", 
                 legend.title.txt = "Nombre de\nvisites",
                 border = "#f5f5f3ff",legend.values.cex = 0.45,
                 col = "#bb2b20ff", inches = 0.2)

# Ajouter un habillage
layoutLayer(title = "James Bond autour du Monde",
            author = "Auteur : T. Giraud - 2016", 
            sources = "Source : Wikipedia.org - 2015", 
            scale = NULL, frame = FALSE, 
            col = "white", 
            coltitle = "black")
cliquer pour agrandir
cliquer pour agrandir

Nous remarquons deux choses : la partie européenne de la carte est peu lisible et l’export de l’image n’est pas idéal (grosses marges sur les côtés).
Nous allons donc ajouter un zoom sur l’Europe dans un coin de la carte et exporter une image respectant le ratio hauteur/largeur du fond de carte.

Le carton

A la suite du code précédent nous allons ajouter ce qui suit.

par(fig = c(grconvertX(c(6000000,16000000), from="user", to="ndc"),
            grconvertY(c(-6600000,1500000), from="user", to="ndc")),
    mar = c(0,0,0,0),  
    new = TRUE)

L’argument fig de la fonction par permet de spécifier une zone de la figure en cours dans laquelle on pourra afficher une autre figure. fig attend un vecteur de coordonnées donnant les limites de la nouvelle figure. Les fonctions grconvertX et grconvertY permettent de convertir des coordonnées en unités de la carte en fraction de la fenêtre graphique (valeurs entre 0 et 1). Enfin, il faut ajouter new = TRUE pour rajouter la nouvelle figure à la figure existante.
La zone définie par les coordonnées utilisées ici recouvre l’Océanie.
Nous pouvons ensuite rajouter le zoom sur l’Europe en centrant la carte sur une zone qui s’étend du Portugal à la Lettonie.

# Centrer la carte sur l'Europe
plot(WorldCountries[WorldCountries$ISO2 %in% c("PT", "LV"),], 
     border = NA,
     bg = "#cdd2d4")

# Ajout des pays
plot(WorldCountries, col = "#f5f5f3ff", 
     border = "#a9b3b4ff", 
     add=T)

# Afficher les cercles proportionnels
propSymbolsLayer(spdf = WorldCountries, df = BondVisits,
                 var = "n", legend.pos = "n", 
                 border = "#f5f5f3ff",
                 col = "#bb2b20ff", inches = 0.2)

# Ajouter un titre au carton
mtext(text = "Zoom sur l'Europe", side = 3, line = -1, 
      adj = 0.95, cex = 0.8, font = 2)

# Ajouter un cadre autour de la figure
box(col = "grey20", lwd = 2)
cliquer pour agrandir
cliquer pour agrandir

Nous avons bien ajouter un carton avec un zoom sur l’Europe.
Reste le problème de l’export.

L’export

La fonction getFigDim sert à obtenir des figures dont les dimensions sont contrôlées et dépendent de l’étendue d’un objet spatial.

fdim <- getFigDim(spdf = WorldCountries[WorldCountries$ISO3 %in% 
                                          c( "RUS","NZL", "ARG"),], 
                  width = 750, res = 120,
                  mar = c(0,0,1.2,0))

La fonction prend en entrée un SpatialPolygonsDataFrame (ici celui-ci ne contient que trois pays), la largeur souhaitée (750 pixels), la résolution souhaitée (120 ppi) et les marges utilisées par la figures (0,0,1.2,0).
Le résultat de la fonction (750, 428) nous donne les dimensions de la figure à utiliser.

png(filename = "mapcarton.png", 
    width = fdim[1], height = fdim[2], 
    res = 120)
par(mar = c(0,0,1.2,0))
#############Code pour générer la figure######
dev.off()
cliquer pour agrandir
cliquer pour agrandir

Et voila!

Le code complet est disponible sur ce gist.


Une réflexion au sujet de « Comment faire un carton avec R? »

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *