Plusieurs articles de ce carnet ont déjà été consacrés à la cartographie de données linguistiques. Ceux-ci présentaient des méthodes, applicables sans expertise en géomatique, permettant de produire des cartes au format HTML via la librairie Python folium
. Voici maintenant comment procéder pour obtenir des représentations cartographiques similaires en utilisant R et la librairie leaflet
, dont folium
est un équivalent.
Je ne suis toujours pas géomaticien et je suis par ailleurs débutant dans l’utilisation de R, le code présenté ici sera donc particulièrement accessible.
Le script R ne figure pas intégralement dans l’article. Vous pouvez le télécharger sur Github ou Gitlab et le réutiliser librement. Le répertoire contient également les deux exemples de fichiers de sortie, sur Github comme sur Gitlab.
Nous allons tenter de créer une carte semblable à celle-ci, présentée dans l’article Cartographier des données linguistiques avec Python – 1.
Objectifs
Il serait tout à fait possible de reproduire strictement la même carte, ce qui ne serait cependant pas forcément d’un très grand intérêt. Pour limiter la redondance, la carte produite ici ne sera pas exactement identique à celle-ci mais conservera ses caractéristiques principales :
- L’utilisation du fichier d’entrée hmon1336.tsv1.
- La représentation des données sous forme de points/marqueurs.
- La mise en place pour chaque marqueur d’un pop-up contenant le nom de la langue, son identifiant dans la base Glottolog ainsi qu’un lien cliquable vers la page web correspondante.
- L’export du résultat obtenu dans un fichier au format HTML.
Ainsi, la carte générée par le script présenté ici ressemblera à ceci (voir en ligne) :
Construction du script R
Il faudra tout d’abord importer deux librairies, leaflet
2 (documentation) bien sûr, et htmltools
. Les étapes à suivre sont ensuite les suivantes :
- Lecture des données du fichier d’entrée.
- Déclaration de la carte.
- Ajout du fond de carte.
- Ajout des marqueurs.
- Export de la carte au format HTML.
L’export de la carte dans un fichier de sortie peut se faire de différentes façons, selon votre choix il faudra éventuellement installer et importer la librairie mapview
en plus de leaflet
et htmltools
.
Note : Le script a été écrit sous RStudio3. Par souci de simplicité et d’accessibilité, l’opérateur magrittr %>%
n’a pas été utilisé.
Lecture des données d’entrée
Le fichier d’entrée sera lu avec la fonction read.csv()
, qui peut être appliquée à une URL.
Si vous reprenez le fichier fourni en exemple sur Gitlab, veillez à bien utiliser l’URL de la version raw du fichier mis en ligne, qui n’intègre pas l’interface de Gitlab. Celle-ci est accessible en cliquant sur le bouton Open raw de la page de visualisation et/ou téléchargement du fichier, ou directement sur cette page.
Si le séparateur utilisé n’est pas la virgule, il faut l’indiquer en renseignant le paramètre sep
. Avec l’URL du fichier associée à la variable hmon1336_url
, voici comment lire le tableau de données :
hmon1336 = read.csv(hmon1336_url, sep = '\t')
À ce stade, vous devriez pouvoir visualiser le tableau avec View(hmon1336)
.
Les données peuvent maintenant être exploitées pour produire une ou plusieurs cartes.
Création d’une carte basique
Pour commencer, générons une carte en gardant tous les paramètres par défaut. D’après les étapes énoncées plus tôt, il faut maintenant déclarer la carte, ce qui se fait simplement avec nom_de_la_carte = leaflet()
. Dans le script fourni en exemple, j’ai arbitrairement nommé cette carte carte_facile
.
L’ajout du fond de carte par défaut n’est pas plus complexe :
carte_facile = addTiles(carte_facile)
Le fond utilisé sera alors celui d’Open Street Map. Attention, n’oubliez pas cette étape ! Si vous ne déclarez aucun fond de carte, le script ne lèvera pas d’erreur et produira une “carte” dont le fond est uniformément gris. Pour vérifier, vous pouvez appeler votre carte à tout moment pour la prévisualiser, même si aucun point/marqueur n’y a été ajouté4.
Il ne reste qu’à intégrer les coordonnées des points. Contrairement au script Python, il n’y a pas besoin de boucle. La déclaration de l’ensemble des points (ici, avec des marqueurs en cercles) va suivre la syntaxe de base suivante :
nom_de_la_carte = addCircleMarkers(nom_de_la_carte,
lng = tableau_de_données$colonne_longitude,
lat = tableau_de_données$colonne_latitude)
D’autres paramètres optionnels peuvent être ajoutés, notamment popup
pour définir le contenu d’un pop-up qui se déploie lorsqu’on clique sur un marqueur. Dans le fichier d’entrée les colonnes qui nous intéressent sont intitulées, de façon transparente, Longitude
et Latitude
. Les données étant associées à la variable hmon1336
, les coordonnées géographiques sont accessibles avec hmon1336$Longitude
et hmon1336$Latitude
.
carte_facile = addCircleMarkers(carte_facile,
lng = hmon1336$Longitude,
lat = hmon1336$Latitude,
popup = hmon1336$Name)
La carte obtenue se présente comme ceci (voir en ligne) :
Dans l’absolu, outre l’absence de lien cliquable dans les pop-ups, cette carte est déjà assez proche de celle prise en modèle et qui avait été produite avec Python. En partant des principes de constitution de cette “carte par défaut”, il est possible de produire une carte paramétrée beaucoup plus finement.
Paramétrage d’une carte personnalisée
Voici maintenant comment obtenir, à partir des mêmes données, la carte présentée en début d’article. Ses caractéristiques sont les suivantes :
- Le zoom/dézoom est restreint.
- Le fond de carte a été modifié.
- Les marqueurs ont une icône personnalisée.
- Les marqueurs proches les uns des autres se regroupent en clusters selon le niveau de Zoom.
- Le pop-up comporte un lien vers la page Glottolog correspondant à la langue représentée par chaque marqueur.
Personnaliser la carte
Ici limiter le zoom n’a qu’un intérêt esthétique et sera surtout l’occasion de montrer que certaines options peuvent être déclarées dès l’instanciation de leaflet()
à la base de la carte :
hmon1336_carte = leaflet(options = leafletOptions(minZoom = 2, maxZoom = 16))
Comme l’indique la documentation, d’autres paramètres peuvent être définis avec leafletOptions()
; c’est notamment le cas du système de projection.
La création de la carte continue de suivre le même déroulement global, l’étape suivante consiste donc à choisir le fond de carte. La fonction addProviderTiles()
va permettre de sélectionner un fond de carte différent du fond par défaut. Le choix du fond de carte s’effectue en renseignant le paramètre provider
de la fonction, avec la syntaxe provider = providers$fond_de_carte_choisi
. Dans le script téléchargeable, j’ai choisi d’utiliser le fond de carte Wikimedia, soit provider = providers$Wikimedia
5.
Personnaliser les marqueurs
Il est possible d’exploiter FontAwesome, les glyphicons Bootstrap ou Ionicons pour personnaliser l’aspect des marqueurs.
Choisir et déclarer une icône
Ce n’est pas obligatoire, mais ici le choix d’icône via la fonction awesomeIcons()
a été déclaré avant l’ajout des marqueurs à la carte.
icons = awesomeIcons(
icon = 'chatbubbles',
iconColor = 'black',
library = 'ion'
)
Il est bien sûr important de bien spécifier le nom de la librairie ainsi que celui de l’icône afin que celle-ci s’affiche correctement. Pour l’exemple j’ai utilisé l’icône chatbubbles
de Ionicons. Pour obtenir son nom, j’ai simplement récupéré la valeur de l’attribut name
du snippet HTML fourni. Le nom de l’icône figure aussi en intitulé de la barre contenant le snippet :
La variable icons
peut maintenant être appelée pour afficher des marqueurs personnalisés sur la carte.
L’ajout des marqueurs se fait avec une syntaxe très proche de celle utilisée pour la “carte par défaut”, sauf que la fonction à utiliser s’appelle cette fois addAwesomeMarkers()
.
Préciser le contenu du pop-up
Voici où nous en sommes pour le moment :
hmon1336_carte = addAwesomeMarkers(hmon1336_carte,
hmon1336$Longitude,
hmon1336$Latitude,
icon = icons)
Il serait possible d’ajouter simplement popup= hmon1336$Name
comme précédemment, mais le contenu du pop-up peut être plus informatif que ça. Comme prévu, le pop-up va comporter le nom de la langue (correspondant à hmon1336$Name
) sur une première ligne, puis sur une seconde ligne son identifiant Glottolog avec un lien vers la page consacrée.
Ces différents éléments peuvent être concaténés grâce à la fonction paste()
, avec l’argument sep
pour spécifier le séparateur, puis les éléments à concaténer. Comme vous l’avez peut-être vu dans la version Python, le contenu du pop-up doit être en HTML. Le but étant ici d’obtenir 2 lignes, le séparateur à indiquer est donc <br/>.
Par ailleurs, pour éviter de générer des problèmes en concaténant des chaînes de caractères dont on ne connaît pas forcément le contenu exact6, il est préférable d’échapper les caractères spéciaux avec la fonction htmlEscape()
.
La syntaxe pour le pop-up ressemble alors à ceci :
popup = paste(sep = '<br/>',
htmlEscape(hmon1336$Name),
# Lien vers la page Glottolog correspondant à l'identifiant
)
Le fichier d’entrée fournit les coordonnées géographiques, le nom et l’identifiant Glottolog, mais pas l’URL de la page associée. Ce n’est pas un problème car les URL des pages Glottolog sont toutes construites sur le modèle suivant, où xxxx1234 représente l’identifiant :
https://glottolog.org/resource/languoid/id/xxxx1234
Puisque l’identifiant est disponible, reconstituer l’URL et le HTML du lien se résume à une concaténation, à nouveau avec paste()
. Ce n’est pas compliqué, mais il faut faire attention à deux détails :
- Il n’est pas obligatoire de déclarer
sep
, mais il prendra alors sa valeur par défaut (sep = ' '
). Ce n’est pas adapté ici puisque l’insertion d’espace rendra l’URL invalide. Il est nécessaire de déclarersep = ''
. - La chaîne de caractères à reconstituer contient des guillemets, il faut veiller à la cohérence entre
"
et'
dans les arguments passés àsep
7.
Avec le code du script mis à disposition, voici comment se présentent les pop-ups, dans le HTML source et sur la carte :
Southern Guiyang Hmong
<br>
<a href="https://glottolog.org/resource/languoid/id/sout1555"> sout1555 </a>
Ce n’est qu’un exemple, mais en reprenant les mêmes principes vous pouvez mettre en pop-up les données de votre fichier d’entrée et/ou les chaînes de caractère de votre choix, selon votre projet.
Regrouper les marqueurs en clusters
Lorsque le nombre de marqueurs est important, si le niveau de zoom est insuffisant les marqueurs risquent de recouvrir tout ou partie de la carte, ce qui n’en facilite pas la lecture. C’est extrêmement simple, il suffit d’ajouter ceci à la déclaration des marqueurs :
clusterOptions = markerClusterOptions()
Ainsi, les marqueurs vont se réorganiser et former des clusters en fonction du niveau de zoom afin de ne pas saturer la carte. Chaque cluster est cliquable ; au clic les marqueurs se déploient et la vue se centre automatiquement sur la zone correspondante sur la carte.
Exporter la carte dans un fichier
RStudio vous permet de prévisualiser votre carte, mais en l’état aucun fichier de sortie n’est produit.
Avec l’export de RStudio
Sans importer de librairie supplémentaire, vous pouvez utiliser le bouton Export de RStudio pour enregistrer la carte.
Vous pouvez choisir Save as Image… si vous voulez obtenir une image statique de l’aperçu, mais il est évidemment préférable de sélectionner Save as Web Page… qui enregistrera la carte interactive au format HTML.
Avec Mapview
Une autre possibilité est d’installer et importer la librairie mapview
, dont la fonction mapshot()
permet d’exporter la carte en divers formats, notamment PNG et HTML. La syntaxe à utiliser est mapshot(nom_de_la_carte, url = chemin_d_acces.html)
pour un export au format HTML. Par exemple :
mapshot(hmon1336_carte, url = "hmon1336_carte.html")
Pour un export format image, url =
est à remplacer par file =
.
Ajouter le titre de la carte
À ce stade, si vous avez suivi ou recopié le script téléchargeable, vous devriez avoir une carte semblable à celle-ci, enregistrée dans un fichier HTML que vous pouvez ouvrir avec votre navigateur. Mais ! Si vous avez utilisé le bouton export de RStudio pour enregistrer la carte, la fenêtre/l’onglet porte le chemin d’accès du fichier comme titre, et si vous avez utilisé la fonction mapshot()
la fenêtre ou l’onglet s’intutile leaflet.
C’est normal, ce titre correspond à la valeur de l’élément <title>
dans le HTML source. Celle-ci correspond à leaflet quand le fichier est enregistré avec mapshot()
, et l’export HTML de RStudio ne comporte pas d’élément <title>
.
Il suffit alors d’ouvrir le fichier dans l’éditeur de texte de votre choix, puis soit modifier la valeur de l’élément <title>
à votre convenance, soit ajouter un élément <title>
.
Si vous avez suivi le script téléchargeable (Github, Gitlab), vous devriez avoir produit une carte identique à celle-ci.
- Décrit dans cet article. [↩]
- Créée par Volodymyr Agafonkin. [↩]
- RStudio 2022.02.3+492. [↩]
- Si vous ajoutez des marqueurs sur une carte sans fond de carte, ils apparaîtront sur le fond gris. [↩]
- En raison de problèmes d’affichage du fond de carte Wikimedia, pour la version en ligne le fond Open Street Map a été utilisé. Il sera mis à jour ultérieurement si l’affichage fonctionne à nouveau. Le fond Wikimedia fonctionne correctement en version locale, et a été conservé dans l’exemple de fichier de sortie à télécharger sur Github ou Gitlab. [↩]
- Bien que ce ne soit pas le cas ici. [↩]
- Pour faciliter la compréhension de ce point, j’ai décomposé les éléments un peu plus que nécessaire dans le script téléchargeable. [↩]
OpenEdition vous propose de citer ce billet de la manière suivante :
Alexander Delaporte (23 août 2022). Cartographie linguistique avec R. Tekipaki. Consulté le 11 décembre 2024 à l’adresse https://doi.org/10.58079/up2u