Dessiner c’est coder !

Camarades cartographes, à travers ce billet, j’entends montrer que l’on peut faire de très jolies cartes avec le langage R ! Oui je sais, des lignes de code c’est repoussant, compliqué et austère. Mais c’est aussi la liberté de bâtir une carte de A à Z sans être contraint par les carcans de tel ou tel logiciel. Ici, à des fins de démonstration, j’ai choisi de reproduire en R cette fameuse carte des murs invisibles publiée dans l’atlas Map Maps [voir] et qui était également présente, dans une version antérieure, dans le Manuel de Cartographie [voir]. Dans les deux cas, de nombreux logiciels avaient été nécessaires pour la réaliser : Excel (pour mettre en forme les données), QGIS (pour préparer le fond de carte), Magrit (pour gérer la projection et la symbologie), Adobe Illustrator (pour la mise en page), etc. Cette nouvelle version de la carte ne mobilise quant à elle qu’un seul et même logiciel : R ! 

Tout commence par une feuille blanche

Dans cet environnement de travail, plus besoin d’aller télécharger un fichier de données sur un site internet, le dezipper, le remodeler dans un tableur pour le rendre compatible avec les logiciels de cartographie. Plus besoin non plus d’aller télécharger un fond de carte, de l’ouvrir dans un SIG pour en extraire telle couche pertinente, déterminer l’emprise, le projeter puis l’exporter avant de l’ouvrir dans un autre logiciel de cartographie avant de le réexporter vers un autre logiciel de dessin vectoriel. Ici, tout se fait de façon cohérente et continue. Dans R, le package eurostat offre la possibilité d’accéder directement aux données statistiques et aux fonds de cartes des régions européennes (NUTS) à différentes années à différents niveaux de généralisation. Quelques lignes de code suffisent alors pour sélectionner les données utiles et les joindre au fond de carte. Puis, le package rnaturalearth permet d’habiller un peu la carte en ajoutant la mer ou les graticules. Puis, c’est au tour du package sf de jouer son rôle pour la projection cartographique ou autres opérations SIG, etc. Ici, c’est une projection orthographique [voir] centrée sur l’Afrique qui a été choisie pour donner cet effet de perspective (en 2.5D). 

Concernant la représentation cartographique en tant que telle, nous nous servons évidemment du package cartography et de ses nombreuses fonctions. La fonction choroLayer permet de réaliser en quelques lignes une carte choroplèthe. La fonction  getBreaks permet de déterminer les classes de valeurs pertinentes. La fonction getBorders permet d’extraire les frontières pour réaliser une carte de discontinuités (que l’on pourra faire avec la fonction discLayer). Au besoin, on pourra aussi utiliser le package RColorBrewer pour choisir des belles palettes de couleur. Puis, le positionnement des textes et la réalisation des légendes (e.g. legendChoro) vient finaliser la carte avant son export. 

La taille c’est aussi la hauteur

La hauteur des murs est proportionnelle
à la valeur des discontinuités.
Plus les discontinuités sont fortes,
plus les murs sont hauts. 

Sur cette carte, la représentation des discontinuités est inhabituelle. Tout d’abord, pour des raison de lisibilité, seules les 10% les plus fortes sont représentées sur la carte. C’est a dire, les frontières où les valeurs de PIB par habitant de part et d’autre sont très différentes. Ensuite, le choix a été fait de différencier les discontinuités entre deux régions d’un même pays et les discontinuités entre deux régions de deux pays différents. Cela a pour but de mettre en exergue les discontinuités sur les frontières nationales. Pour ces dernières, la hauteur des murs est proportionnelle à la valeur des discontinuités (alors que d’habitude, on fait plutôt varier l’épaisseur de la ligne). Plus les discontinuités sont fortes, plus les murs sont hauts. Pour ce faire, une simple petite boucle en R a permis de faire varier le nombre d’iterations en fonction de la valeur des discontinuités et aussi determiner la hauteur des murs sur la carte. Un effet d’extrusion rendu possible par la projection cartographique choisie. Ainsi, le mur autour du Luxembourg est plus haut que les autres puisque ce pays est énormément plus riches que ses régions voisines.

Des lignes de codes aux lignes de la cartes

Au final, cette carte est le résultat de 200 lignes de code. Ni plus. Ni moins. Et même si effectuer une mise en page jolie et élégante sans utiliser la souris reste laborieux, le résultat final ressemble à s’y méprendre à une carte issue d’un logiciel de DAO. Preuve qu’on peut être un peu geek et dessiner quand même de jolies cartes. Et inversement 😉

Code source disponible sur github.


Coding is Drawing

Comrades cartographers, with this post, I intend to illustrate that you can make very pretty maps with the R language! Yes, I know, lines of code are repulsive, complicated and austere. But it is also the freedom to build a map from A to Z without being constrained by the limitations of any particular software. Here, for demonstration purposes, I have chosen to reproduce in R this famous map of invisible walls published in the Map Maps atlas [see] and which was also present, in an former version, in the Manuel de Cartographie [see]. In both cases, many softwares were required to create it: Excel (to prepare the data), QGIS (to prepare the base map), Magrit (to manage the projection and the symbology), Adobe Illustrator (for the page layout), etc. This new version of the map has only been made with one single software: R! 

A from scratch process

In this workflow, there is no need to download a data file from a website, unzip it, reshape it in a spreadsheet to make it compatible with cartographic software. No more need to download a basemap, open it in a GIS to extract such a relevant layer, determine the extent, project it and then export it before opening it in another mapping tool and again in a CAD software. Everything here is done in a coherent and continuous process. In R, the eurostat package offers the possibility of direct access to statistical data and to the European Regional basemaps (NUTS) at different years at different levels of generalization. A few lines of code are then sufficient to select the useful data and join it to the basemap. Then, the rnaturalearth package allows you to “dress up” the map by adding the sea or the graticule. Then the sf package is next to play its role for cartographic projection or other GIS operations. Here, an orthographic projection [see] centered on Africa was chosen to give this perspective effect (in 2.5D). 

Concerning the cartographic representation as such, we obviously use the cartography package and its many functions. The choroLayer function allows you to create a choropleth map in a few lines. The getBreaks function is used to determine the relevant value classes. The getBorders function allows you to extract the borders to create a discontinuity map (what can be done with the discLayer function). If necessary, we can also use the RColorBrewer package to choose beautiful color palettes. Then, the positioning of the texts and the realization of the legends (e.g. legendChoro) finalize the map before its export. 

The size is also the height

The height of the walls is proportional
to the value of the discontinuities.
The stronger the discontinuities,
the higher the walls. 

On this map, the representation of discontinuities is not common. First of all, for reasons of readability, only the highest 10% are represented on the map. This means, borders where the values of GDP per capita on both sides are very different. Then, the choice was made to make a distinction for discontinuities between two regions of the same country and for discontinuities between two regions of two different countries. For these, the height of the walls is proportional to the value of the discontinuities (whereas usually, the thickness of the line is varied). The stronger the discontinuities, the higher the walls. To do this, a simple loop was used to vary the number of iterations according to the value of the discontinuities and also to determine the height of the walls on the map. An extrusion effect made possible by the chosen cartographic projection. Thus, the wall around Luxembourg is higher than the others because this country is much richer than its neighboring regions.

From code lines to map lines

Finally, this map is the result of 200 lines of code. No more. No less. And even if making a pretty and attractive layout without using the mouse remains laborious, the final result looks like a map from a CAD software. Proof that you can be a little geeky and still draw pretty maps. And vice versa 😉

Source code available on github.


Nicolas Lambert

Ingénieur de recherche CNRS en sciences de l'information géographique. Membre de l'UMS RIATE et du réseau MIGREUROP / CNRS research engineer in geographical information sciences. Member of UMS RIATE and the MIGREUROP network.

Vous aimerez aussi...

Laisser un commentaire

Votre adresse de messagerie 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.