Billet

Début de cartographie avec R

Billet publié le 14/07/2008

R, le logiciel libre de statistiques, peut être étendu au traitement de données spatiales, et il arrive même à générer des cartes. La plupart des exemples que j’ai trouvés en ligne concernent l’utilisation de fichiers de type shapefile .shp, j’avais besoin d’un outil plus simple.
Le package “maps” qui contient une carte des départements français, semblait un point de départ intéressant. Ce billet a pour but d’aider d’autres novices qui souhaiteraient produire des choses similaires à ceci :

Les deux cartes ci-dessus ont été produites avec R et le paquet “maps”. Elles présentent, pour l’année 2004, le nombre de naissances d’enfants mâles nommés Ewen et Erwan pour la France métropolitaine et continentale. En gros, Erwan a été abandonné par les Bretons et adopté par les Chtis. Les Bretons ont produit le superceltique “Ewen” qui est très rare en dehors de la Bretagne [Pour une discussion sur les prénoms bretons, voir ici].

*

Le principal problème, à mon avis, avec la géo-statistique, c’est l’établissement du lien entre le fond de carte et les données. Comment l’ordinateur peut-il comprendre que certains chiffres correspondent à certains départements ? C’est sur cette question que je vais me centrer ici. Je n’aborderai pas du tout la sémantique cartographique ou le choix de données significatives (proportions plutôt que valeurs absolues, etc…).
Commençons par installer le paquet “maps” :

install.packages("maps")
library(maps)
france<-map(database="france")

L’objet “france” est composé de descriptifs des polygones départements : $x (longitudes) et $y ; d’une description de la zone : $range ; et des noms des départements : $names.
L’instruction france$names donnera, dans R, une idée :

  [1] "Nord"                                 "Pas-de-Calais"                       
  [3] "Somme"                                "Nord"                                
  [5] "Ardennes"                             "Seine-Maritime"  

Les départements ne sont pas identifiés par leur numéro administratif, mais par leur nom, avec des étrangetés comme “Cote-Dor”. Les enclaves (l’exclave du Nord dans le Pas de Calais, dite communauté de communes de l’Enclave) sont représentées : d’où l’apparition, dans la liste ci-dessus, de “Nord” à deux reprises.
Produisons une carte toute simple colorant certains départements :

dpt2001<-c("Ain","Marne","Nord","Charente")
col2001<-c(1,2,3,5)
match <- match.map(france,dpt2001) 
color <- col2001[match] 
map(database="france", fill=TRUE, col=color)

C’est l’instruction “match.map” qui établit le lien entre la liste des départements qui se trouve dans “dpt2001″ et le fond de carte, “france”. Le résultat donne quelque chose comme ceci :

L’exclave du Nord est bien coloriée en rouge, comme les îles (Ré et Oléron) au large de la Charente-Maritime. Et comme l’on n’a pas été strict, R a compris qu’il fallait colorier et Charente, et Charente-Maritime… Cela peut poser problème, attention…
Il est donc préférable, peut-être, de demander ceci à R :

match <- match.map(france,dpt2001,exact=TRUE)

Pour la carte des “Ewen”, mes données sont structurées ainsi (j’ai enlevé le nombre de naissances) :

              nom DPT NOMBRE
1        Calvados  14      *
2    Cotes-Darmor  22     **
3       Finistere  29     **

Et pour obtenir la carte, je demande à R ceci :

dptewen<-ewen$nom
colewen<-ewen$NOMBRE
match <- match.map(france,dptewen,exact=TRUE)
gray.colors <- function(n) gray(rev(0:(n-1)/1.5)/n)
color <- gray.colors(100)[floor(colewen[match])] 
map(database="france", fill=TRUE, col=color)

Au final, donc, il est possible de produire à peu de frais des cartes, presque aussi facilement qu’avec Philcarto, mais pour bénéficier de ce qu’offre Philcarto (les traitements statistiques intégrés et l’excellente formalisation sémantique), il faudra apprendre encore plus de R.

9 commentaires

Un commentaire par Mxsz (16/07/2008 à 21:49)

Juste deux remarques:
- peut-être qu’un découpage par canton permettrait d’avoir une cartographie plus fine, avec les cantons urbains/ruraux, populaires/bourgeois, etc.
- la question des prénoms est intéressante aussi si l’on pense que, dans les retranscriptions d’entretien, on utilise souvent des pseudo (initiales, “Q” / “R”…) Mais en fonction de quels critères ? Par exemple, dans la Misère du Monde, je ne me souviens pas que l’article final, “Comprendre”, fasse une mention réflexive sur ce sujet.
C’est le sociologue David Lepoutre, entendu il y a quelques années en séminaires, qui avait attiré l’attention de son auditoire sur ce point. Je ne sais pas s’il l’a développé par ailleurs.
Peut-être que nous ne devrions utiliser que des pseudos qui soient statistiquement équivalent (toutes choses égales par ailleurs) à celui de la personne rencontrée et interrogée… En fait, j’en sais rien.

merci en tout cas pour ces posts sur la carto.

Un commentaire par Baptiste Coulmont (16/07/2008 à 21:59)

Il y a quelques lignes dans le Guide de l’enquête de terrain de Beaud et Weber, si je me souviens bien : ils conseillent de trouver des équivalents sociaux pour pseudonyme (en trouvant un prénom proche à partir de “La Cote des prénoms” de Besnard et Desplanques).
Pour ce qui est du découpage plus précis : on n’en dispose pas à partir du “Fichier des prénoms”, mais cela doit être possible à partir des Enquêtes emploi (mais celles qui contiennent le prénom comme variable datent de plus de 20 ans).

Un commentaire par Markss (26/07/2008 à 0:14)

L’avantage que j’ai trouvé en utilisant philcarto (pas par rapport à R, dont je ne connait que les rudiments, mais par rapport à Stata) est qu’il donne une très large combinaison de fonds de carte, en particulier avec un découpage à l’échelle de la zone d’emploi, qui m’était nécessaire mais n’existait pas à ma connaissance dans les cartes Stata. Qu’en est-il pour R? D’ailleurs le fait qu’il faille utiliser les noms peut poser de gros problèmes à des niveaux plus fins de découpage, où l’on n’aura pas la patience de corriger un accent oublié dans une des bases, ou un tiret non pris en compte.

Un commentaire par Baptiste Coulmont (26/07/2008 à 8:47)

> Markss : R va gérer tous les fonds de carte au format .shp (pour Philcarto, il faut passer par Phildigit pour les convertir au format .ai) et gérer les projections (pour ne pas avoir des cartes toutes écrasées). C’est formidable pour les USA (on trouve tout en .shp)… Pour la France, je ne sais pas (peut-être via l’union européenne ?)
Je pense qu’il est assez simple de créer un fonds de carte avec Inkscape.
Pour ce qui est des noms : il me semble que c’est une particularité du fond de carte de France. Il est assez simple de modifier cela (ce fond est juste un fichier à l’architecture toute simple : coordonnées des polygones, noms).

Un commentaire par Philippe Waniez (22/09/2008 à 18:12)

Bonjour,

Après avoir lu votre article sur la cartographie avec “R”, je dors sur mes deux oreilles! Ce que vous présentez ressemble (en moins bien) à ce que nous faisions avec SAS il y a 20 ans!

Allez donc expliquer à des gens incapables de programmer quoi que ce soit qu’il faut écrire des lignes de commandes à n’en plus finir pour obtenir un résultat sommes toutes assez médiocre.

Heureusement qu’il y a quelques “happy few” (dont vous faites partie semble-t-il) pour faire compliqué quand on peut faire simple… Ââââ que c’est bon d’avoir l’impression d’être savant (j’imagine)…

Au total, Philcarto, dont je suis l’auteur reste un logiciel relativement facile à apprendre et offrant d’assez grandes possibilités de traitement des données. Pour ce qui est des fonds de cartes, Phildigit résoud la grande majorité des problèmes y compris l’importation des bases cartographiques au format ArcView, Mapinfo, texte…

L’enregistrement des cartes au format AI, SVG et EMF permet de les éditer dans prratiquement tous les logiciels de dessin.

Et tout ça, c’est gratuit et ça cause même anglais (pour les gens savants).

Bien amicalement.

Philippe Waniez

Un commentaire par Baptiste Coulmont (22/09/2008 à 18:38)

> Philippe : Vous avez raison sur la facilité d’usage de Philcarto. C’est ce que je recommande aux personnes qui souhaitent rapidement faire des cartes (et en plus sans avoir à se soucier des exigences des géographes : philcarto résoud cela). J’y ai passé des mois, dans le cadre de ma thèse (avec un petit article dans Mappemonde à la clé)
Si j’ai commencé à utiliser R, c’est pour la possibilité de programmer : par exemple, on peut lui dire de faire une série de 100 cartes et y associer automatiquement quelques graphiques, ce que philcarto ne permet pas.
Et comme je débute, mes cartes ne sont pas très jolies…
Je ne vous suis plus quand vous écrivez «Heureusement qu’il y a quelques “happy few” (dont vous faites partie semble-t-il) pour faire compliqué quand on peut faire simple… Ââââ que c’est bon d’avoir l’impression d’être savant (j’imagine)..» ou «Ce que vous présentez ressemble (en moins bien) à ce que nous faisions avec SAS il y a 20 ans!»
J’aime beaucoup explorer (différentes méthodes, différents terrains, différents logiciels) et en parler. Pas pour “faire savant”, mais parce que je suis heureux d’avoir réussi à faire tourner R… Et je présente sur mon blog des états non finis de la recherche : c’est peut-être moins bien que ce que vous faisiez il y a 20 ans, OK…

Un commentaire par Joël (23/11/2008 à 16:27)

Tiens, je découvre que tu t’es aussi frotté à la cartographie. PhilCarto est génial par sa simplicité d’utilisation, mais aussi sa puissance pour certains aspects, notamment l’analyse statistique et spatiale intégrée. Mais je suis confronté à deux problèmes : 1) je n’arrive pas à faire tourner PhilDigit, l’utilitaire de conversion de fonds de cartes, sur des fichiers un peu lourds (ça plante mon ordi) 2) surtout, il me semble extrêmement dommage que PhilCarto ne soit pas libre. Gageons que s’il l’était, son développement serait supérieur à ce qu’il est, car nous manquons encore d’un vrai SIG/logiciel de carto libre. Du coup je vais m’essayer aussi un peu à la carto sous R.

Un commentaire par Ogo (25/01/2009 à 13:18)

Une petite erreur de syntaxe dans le programme :
Il faut remplacer

color <- color2001[match]

par

color <- col2001[match]

Un commentaire par Baptiste Coulmont (25/01/2009 à 14:17)

merci, je corrige !