Cartographier des données linguistiques avec Python – 2

Lorsqu’on sait produire une carte avec des données représentées par des points, il est très simple d’ajouter plusieurs séries de données correspondant à autant de séries de points. Pour améliorer la lisibilité de l’ensemble, il peut devenir intéressant (voire indispensable) de ne pas afficher la totalité des données simultanément.

Pour les cartes créées avec folium, c’est ce que permet de faire la classe LayerControl().

Prérequis

Cet article constitue un complément à l’article Cartographier des données linguistiques avec Python – 1, consacré à la création d’une carte avec ajout d’une ou plusieurs couches de données, qui seront représentées sous forme de points. Je n’expliquerai donc pas ici comment constituer la carte, puisque la carte utilisée ici a été générée suivant la même méthode.

Comme pour l’article précédent, je proposerai ici de télécharger le code Python 3 dans un notebook Jupyter.

Ajouter LayerControl() à une carte

Le notebook présenté dans cet article est téléchargeable sur Gitlab, avec son fichier d’entrée (format TSV) et son fichier de sortie (la carte au format HTML).
Il est possible de consulter la carte sur cette page, sans téléchargement nécessaire.

Le but sera ici d’obtenir une représentation visuelle semblable à ceci (consulter en ligne) :

Avant d’ajouter le sélecteur pour l’affichage des couches de données (il s’agit de la petite fenêtre en bas à droite de la carte), il faut bien entendu disposer d’une carte comportant une ou plusieurs couches de données.

Mise en place de la carte

La construction de la carte se fait comme expliqué ici, avec déclaration d’un fond de carte, déclaration d’une ou plusieurs couches de données, puis ajout de données à partir d’un fichier source au format CSV ou TSV. Attention, il est ici important de renseigner l’attribut name des différentes couches de données ajoutées à la carte.

Pour l’exemple, j’ai utilisé des données issues de la page Family: Japonic de Glottolog1. Cette famille est divisée en 3 sous-familles : Hachijo, Japanesic et Ryukyuan.

  • Dans le code, une couche de données a été déclarée pour chacune de ces sous-familles (elles correspondent respectivement aux variables hachijo, japanesic et ryukyuan). Ces couches ont ensuite été ajoutées à la carte ma_carte, une fois alimentées par les données du fichier TSV pris en entrée.
  • Sur la carte, puisqu’au moment de l’ajout des points chaque couche a été paramétrée avec une couleur différente, les points représentant chaque sous-famille ont une couleur distincte (Hachijo en vert, Japanesic en bleu et Ryukyuan en orange).
Aperçu de la carte à cette étape.

Contrôle de l’affichage

Dans l’absolu, une ligne de code suffit pour instancier un objet folium.LayerControl() et ajouter le sélecteur à la carte, je voudrais toutefois commencer par vous présenter une possibilité supplémentaire de personnalisation de la carte.

Si vous avez consulté l’exemple de carte mis à disposition, vous avez peut-être remarqué qu’il était possible d’afficher ou masquer les points, mais aussi de changer le fond de carte. Pour ce faire, il faut ajouter des fonds de carte supplémentaires, en suivant une syntaxe folium.TileLayer('nom_du_fond_de_carte').add_to(nom_de_la_carte)2. Ici la carte (nommée ma_carte) avait été déclarée avec tiles='CartoDB positron', et 3 fonds de carte alternatifs ont été ajoutés :

folium.TileLayer('openstreetmap').add_to(ma_carte)
folium.TileLayer('Stamen Toner').add_to(ma_carte)
folium.TileLayer('Stamen Watercolor').add_to(ma_carte)

Cette étape d’ajout de fonds de carte est facultative. Pour qu’elle soit correctement prise en compte dans la carte qui sera produite ensuite, il est obligatoire d’ajouter les fonds de carte avant la déclaration de folium.LayerControl().

Le contrôle de l’affichage des différents éléments (couches de données et éventuellement fonds de carte) peut maintenant être mis en place, simplement en déclarant une instance de folium.LayerControl() qui sera ajoutée à la carte avec add_to(nom_de_la_carte), comme pour les couches de données et les fonds de cartes additionnels. Ici, pour la carte appelée ma_carte :

folium.LayerControl(position='bottomright', collapsed=False).add_to(ma_carte)

Il est à noter que par défaut, le sélecteur s’affiche en haut à droite de la carte et en mode “réduit”, c’est-à-dire sous forme d’un bouton sur lequel il faudra cliquer pour déployer le sélecteur à proprement parler. Les options choisies ici permettent de le faire apparaître en bas à droite, déjà déployé3. Les différentes options de folium.LayerControl() sont présentées sur cette page de la documentation.

Je précisais plus haut qu’il était important de spécifier l’attribut name lors de la déclaration des couches de données (folium.FeatureGroup()). Sa valeur est en effet récupérée automatiquement pour constituer le sélecteur, c’est pourquoi la carte en exemple affiche Hachijo, Japanesic et Ryukyuan : ce sont les valeurs que j’avais indiquées lors de la création des trois couches de données. Les différents fonds de carte ont ici gardé chacun leur nom par défaut, soit cartodbpositron, openstreepmap, stamentoner et stamenwatercolor. Ces chaînes de caractères sans espaces ni majuscules n’étant pas forcément agréables à lire ni très explicites, il est possible de renseigner un attribut name pour les fonds de carte également, lors de leur déclaration. Par exemple ici, le fond Open Street Map a été déclaré comme suit :

folium.TileLayer('openstreetmap').add_to(ma_carte)

Sur la carte, il s’appelle alors par défaut openstreetmap. Pour remplacer cette valeur par “Open Street Map” :

folium.TileLayer('openstreetmap', name='Open Street Map').add_to(ma_carte)

Carte HTML

La carte enregistrée en HTML4 peut être visionnée dans un navigateur et est interactive. Il est maintenant possible lors de la consultation de choisir le fond de carte, ainsi que de choisir quelle(s) série(s) de points faire apparaître ou non, selon les couches de données déclarées dans le code.

Si vous avez réutilisé le code et le fichier d’entrée du notebook sans les modifier, cliquer sur un point ouvrira une étiquette comportant le nom de la langue ainsi qu’un lien permettant d’accéder à la page Glottolog qui lui est consacrée5.

Citer ce billet : “Cartographier des données linguistiques avec Python – 2”, par Alexander Delaporte. Publié sur Tekipaki le 08/02/2021. Lien : https://tekipaki.hypotheses.org/1362.
  1. Glottolog 4.3 par Hammarström, Harald & Forkel, Robert & Haspelmath, Martin & Bank, Sebastian sous licence Creative Commons Attribution 4.0 International License []
  2. Pour rappel, la liste des fonds de carte disponibles se trouve dans la documentation de folium. []
  3. C’est avantageux ici parce que le sélecteur ne masque pas la carte, mais en fonction de l’aspect de la carte et du nombre de couches et fonds de carte, il peut être préférable ne pas utiliser collapsed=False (inutile de déclarer collapsed=True, il s’agit de la valeur par défaut.). []
  4. nom_de_la_carte.save('nom_du_fichier.html') []
  5. Voir cet article pour explication. []

Auteur/autrice : Alexander Delaporte

Ingénieur d'études au Centre de recherches linguistiques sur l'Asie Orientale

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.