Réaliser une carte avec R (1)

Ce tutoriel en plusieurs parties a pour but d’expliquer comment réaliser une carte avec le logiciel de statistiques R. Je me limiterai à la réalisation des cartes descriptives et analytiques simples telles que peut en avoir besoin un linguiste de terrain ou un dialectologue, et je donnerai des liens pour des travaux de cartographie plus avancés. Les exemples présentés concerneront des cartes du Japon, notamment de la région des Ryūkyū, mais ils sont bien sûr adaptables à toutes les régions du monde.

Vous pouvez télécharger le code source complet du notebook R de ce tutoriel ici et le fichier contenant uniquement le code R ici.

Avant toute chose

De nombreux collègues linguistes apprécient les cartes que j’utilise dans mes publications, et certains me demandent de temps à autre d’en réaliser pour eux. J’ai ainsi par exemple réalisé l’ensemble des cartes des ouvrages An introduction to Ryukyuan languages et Handbook of Ryukyuan Languages, ou encore la carte d’un récent article de Lai Yunfan dans les Cahiers de Linguistique Asie Orientale. Or comme dit le proverbe, qui n’est ni une citation de Lao Zi ou de Confucius ni même un dicton chinois, «donne un poisson à un homme, il mangera un jour; apprends-lui à pêcher, il mangera toute sa vie», et il est prséférable que j’explique comment je réalise mes cartes.

Pourquoi réaliser des cartes avec R? Parce que tout d’abord une simple capture d’écran de Google Maps fait rarement une belle carte. Ensuite parce que parmi tous les logiciels permettant de faire des cartes, R est celui qui est le plus susceptible d’être déjà connu et d’être utile de manière générale à un linguiste. En effet, R n’est pas un logiciel de cartographie mais de statistiques, et la maitrise de R poura donc servir dans d’autres contextes, tandis qu’un logiciel de cartographie demanderait un investissement particulier pour apprendre à s’en servir. Enfin, R est gratuit, libre, et il s’agit d’un langage de programmation qui permet donc de travailler efficacement en utilisant des scripts plutôt qu’une interface «pointer et cliquer». On pourra comparer avec la procédure présentée sur le blog de Language Science Press, où il faut télécharger et modifier manuellement une carte. Cette procédure est tout à fait valable, mais cela devient vite peu pratique et particulièrement chronophage si l’on a besoin de réaliser de nombreuses cartes ou de les modifier souvent. Toute action répétitive sur un ordinateur devrait être automatisée par un script (c’est la raison d’être d’un ordinateur!). Il n’est pas non plus possible de cartographier des données quantitatives comme on le verra au cours de ce tutoriel.

Je considére pour ce tutoriel que le lecteur maitrise les bases du logiciel R, et notamment la création de graphiques avec le module ggplot2. Je ne détaillerai toutes les fonctions et options disponibles, pour lesquelles la documentation de R doit être consultée.

Première carte

Commençons par réaliser une carte simple avec le module ggmap. Nous allons tout d’abord obtenir un fond de carte centrée autour de Shuri, à Okinawa, depuis les serveurs Google Maps. Il suffit de récupérer les coordonnées de Shuri, par exemple sur Google Maps en faisant clic droit sur la carte et en sélectionnant «Plus d’infos sur cet endroit». La fonction geocode() permet aussi de trouver les coordonnées de lieux identifiés.

 

require(ggmap)
shuri <- geocode("Shuri castle") # équivalent à shuri <- c(lon = 127.195, lat = 26.21701)
shuriMap <- get_map(location = shuri)
ggmap(shuriMap)

Zoom

On peut régler le zoom avec l’option du même nom de la fonction get_map().

shuriMap <- get_map(location = shuri, zoom = 8)
ggmap(shuriMap)

shuriMap <- get_map(location = shuri, zoom = 16)
ggmap(shuriMap)

Couleur

L’option color permet de choisir entre une carte en couleurs et une carte en noir et blanc (en fait en niveaux de gris).

shuriMap <- get_map(location = shuri, color = "bw")
ggmap(shuriMap)

Type

L’option maptype permet de choisir entre les types de visualisation proposés.

shuriMap <- get_map(location = shuri, maptype = "satellite")
ggmap(shuriMap)

Source

Enfin, il est possible d’utiliser d’autres sources de cartes avec l’option source. Malheureusement, pour des raisons technniques, il n’est plus possible d’utiliser source = "osm" pour afficher des cartes OpenStreetMap. L’autre source, Stamen, est toujours utilisable avec source = "stamen", mais j’ai du installer la dernière version de ggmap depuis github avec la fonction devtools::install_github("dkahle/ggmap").

shuriMap <- get_map(location = shuri, source = "stamen")
ggmap(shuriMap)

Les cartes Stamen sont sans doute les plus pratiques puisqu’on peut obtenir séparément le fond de carte, les lignes, et les étiquettes toponymiques.

shuriMap <- get_map(location = shuri, source = "stamen", maptype = "terrain-background")
ggmap(shuriMap)

shuriMap <- get_map(location = shuri, source = "stamen", maptype = "terrain-lines")
ggmap(shuriMap)

shuriMap <- get_map(location = shuri, source = "stamen", maptype = "terrain-labels")
ggmap(shuriMap)

Deuxième carte plus avancée: Annotations et décorations

On peut également utiliser la fonction get_stamenmap() et utiliser une paire coordonées passées à l’option bbox pour donner les limites d’une carte Stamen.

shuriMap <- get_stamenmap(bbox = c(left = 126.65, bottom = 26, right = 128.4, top = 26.9), maptype = "terrain-background", zoom = 10)
ggmap(shuriMap)

Une fois la carte de base réalisée on peut bien sûr utiliser les fonctions standard de ggplot2 pour annoter ou décorer notre carte.

ggmap(shuriMap) + 
  geom_point(data = shuri, aes(x = lon, y = lat), color = "red") +
  geom_text(data = shuri, aes(x = lon, y = lat), label = "Shuri", hjust = -0.2, vjust = 0)

L’avantage ici de R et de ggplot2 est qu’on peut facilement afficher un grand nombre de points. Attention néanmoins à la limite de requêtes addressables par geocode.

locs <- c("Shuri castle","Nakijin Yonamine", "Maja Kume-jima","Iejima", "Kudaka")
locsCoord <- geocode(locs, output = "more")
locsCoord$label <- c("Shuri","Yonamine", "Maja","Iejima", "Kudaka")
ggmap(shuriMap) + 
  geom_point(data = locsCoord, aes(x = lon, y = lat), color = "red") +
  geom_text(data = locsCoord, aes(x = lon, y = lat, label = label), hjust = -0.2, vjust = 0)

Enfin, il suffit de sauvegarder la carte sous le nom et au format voulus avec ggsave().

mymap <- ggmap(shuriMap) + 
  geom_point(data = locsCoord, aes(x = lon, y = lat), color = "red") +
  geom_text(data = locsCoord, aes(x = lon, y = lat, label = label), hjust = -0.2, vjust = 0)
ggsave(filename = "mymap.pdf", plot = mymap)

Remarques finales

Vous pouvez télécharger le code source complet du notebook R de ce tutoriel ici et le fichier contenant uniquement le code R ici.

Ceci est suffisant pour réaliser une carte descriptive simple, mais il y a deux limitations. Tout d’abord, il faut être connecté à internet pour que R puisse récupérer la carte, et un trop grand nombre de demandes peut saturer le serveur. En outre, il n’est pas possible de réaliser une carte un peu plus complexe, qui par exemple n’affiche pas uniquement des points correspondant à des localités mais met en valeur une division administrative (commune, préfecture, région, pays, etc.).

À suivre dans la deuxième partie.

Ce billet peut être cité de la façon suivante: Thomas Pellard, « Réaliser une carte avec R (1) », Cipanglossia, 19 juin 2017, https://cipanglo.hypotheses.org/375.


5 réflexions au sujet de « Réaliser une carte avec R (1) »

  1. Ping : Réaliser une carte avec R (6) | Cipanglossia

  2. Ping : Réaliser une carte avec R (7) | Cipanglossia

  3. Ping : Réaliser une carte avec R (4) | Cipanglossia

  4. Ping : Réaliser une carte avec R (2) | Cipanglossia

  5. Ping : Réaliser une carte avec R (3) | Cipanglossia

Laisser un commentaire

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