{"word_count": 637, "character_count": 4869}
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éesJ'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 cartographylibrary(cartography)# Charger les données stockées sur le webload((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 carteLe code suivant créé une carte des pays visités.# Gestion des marges de la figurepar(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 paysplot(WorldCountries, col = "#f5f5f3ff", border = "#a9b3b4ff",     add = T)# Afficher les cercles proportionnelspropSymbolsLayer(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 habillagelayoutLayer(title = "James Bond autour du Monde",            author = "Auteur : T. Giraud - 2016",             sources = "Source : Wikipedia.org - 2015",             scale = NULL, frame = FALSE,             col = "white",             coltitle = "black")[caption id="attachment_882" align="aligncenter" width="680"] cliquer pour agrandir[/caption]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 cartonA 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'Europeplot(WorldCountries[WorldCountries$ISO2 %in% c("PT", "LV"),],      border = NA,     bg = "#cdd2d4")# Ajout des paysplot(WorldCountries, col = "#f5f5f3ff",      border = "#a9b3b4ff",      add=T)# Afficher les cercles proportionnelspropSymbolsLayer(spdf = WorldCountries, df = BondVisits,                 var = "n", legend.pos = "n",                  border = "#f5f5f3ff",                 col = "#bb2b20ff", inches = 0.2)# Ajouter un titre au cartonmtext(text = "Zoom sur l'Europe", side = 3, line = -1,       adj = 0.95, cex = 0.8, font = 2)# Ajouter un cadre autour de la figurebox(col = "grey20", lwd = 2)[caption id="attachment_888" align="aligncenter" width="680"] cliquer pour agrandir[/caption]Nous avons bien ajouter un carton avec un zoom sur l'Europe.Reste le problème de l'export.L'exportLa fonction getFigDim sert à obtenir des figures dont les dimensions sont contrôlées et dépendent de l'étendue d'un objet spatial.fdim &#60;- 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()[caption id="attachment_891" align="aligncenter" width="750"] cliquer pour agrandir[/caption]Et voila!Le code complet est disponible sur ce gist.