Cartes avec R (partie 3)
Par Arthur Charpentier le mardi 30 juin 2009, 15:39 - Informatique / R - Lien permanent
J’avais parlé dans un précédant billet (ici)
des fonds de cartes avec R. Pour reprendre rapidement, on peut faire
des cartes simplement avec des commandes de la forme suivante,
> library(maps)
> map(database="world",regions="France")
Cette dernière commande permet de tracer une carte. Bon, le soucis
avec la France (d’un point de vue de la programmation sous R, je ne
veux me froisser avec personnes) ce sont ses territoires d’outre-mer.
> M1=map(database="world",regions="France",xlim=c(-5,10),ylim=c(40,52))
> str(M1)
’data.frame’: 27 obs. of 5 variables:
$ montant: num 1180374 10897008 6662276 9516513 2102222 ...
$ Y1 : num 2003 2003 2003 2003 2003 ...
$ Y2 : num 2004 2005 2006 2007 2008 ...
$ Z1 : num 1 1 1 1 1 1 2 2 2 2 ...
$ Z2 : num 1 2 3 4 5 6 1 2 3 4 ...
Pour faire quelquechose d’un peu plus joli, on peut utiliser une autre carte.
> M1=map("france")
Remarque: il faut juste faire
attention, sur les cartes un peu grandes sur le style de projection
utilisé, qui peut donner des résultats plus ou moins
curieux.... Mais c’est un sujet un peu compliqué, et hors sujet
(pour l’instant, on verra si je trouve le temps un jour).
J’avais déjà abordé (ici) l’utilisation des départements français avec R. voici une autre méthode, basé sur le
fichier dept.rda comprenant la liste des 95 départements français (nom et
code). Il est disponible ici. En reprenant le code donné sur la page là, on obtient
> my.cols <- c(rgb(231/255,240/255,251/255),rgb(180/255,210/255,244/255),
rgb(129/255,180/255,237/255),rgb(0/255,78/255,162/255))
> load("D:\\dept.rda")
> set.seed(1234)
> xx <- data.frame(names=dept[sample(1:95,15),1],n=round(seq(5,300,length=15)))
> xx$grp <- cut(xx$n,breaks=c(0,50,100,250,1000),labels=FALSE)
> map(’france’)
> map(’france’,regions=xx$names,col=my.cols[xx$grp],fill=TRUE,add=TRUE)
- Utilisation de fichiers shp
Par contre on peut toujours bricoler puisqu’on a les coordonnées de toutes les communes....
> B=read.table("http://perso.univ-rennes1.fr/arthur.charpentier/gc_2008b.csv",sep=";", header=TRUE)
> plot(B$XLAMB2,B$YLAMB2,col="red",cex=.2,pch=19)
> plot(B$XLAMB93,B$YLAMB93,col="green",cex=.1,pch=19)
> plot(B$LONGI_GRD,B$LATI_GRD,col="purple",cex=.1,pch=19)
> plot(B$LONGI_DMS,B$LATI_DMS,col="blue",cex=.1,pch=19)
On peut alors directement utiliser un fichier d’élections, par
exemple le pourcentage de votes
exprimés lors de
l’élection présidentielle de 2002 (ce qui n’a aucun sens,
je sais bien,
un ville de 200 électeurs étant représentée
comme une ville de 200 000). Les points rouges correspondent aux communes où le taux de votes exprimés était inférieur à 70%, et en vert,
les communes où il était supérieur à 90%.
L’exercice n’avait a priori aucun intérêt, pourtant on
voit clairement se détacher des régions sur cette carte.On peut aussi regarder les communes qui ont été déclarées victimes d’une catastrophe naturelle, par exemple les inondations. Une étude par mois donne la carte dynamique suivante
(on retrouve l’absence de corrélation et la forte
corrélation spatiale sur ces cartes). Il existe aussi des bases locales, par exemple les réserves naturelles Bretonnes, ici, ou les zones phytogéographiques, là. Bon, promis, après j’arrête, on peut aussi trouver des données sur les routes ici (sur toute l’Europe). Voici quelques exemples de mise en oeuvre, avec tout d’abord des fonds de région et de départements,
> library(maptools)
> SHP="http://perso.univ-rennes1.fr/arthur.charpentier/fr.shp"
> M3=readShapePoly(SHP))
> plot(M3)
et
> SHP="http://perso.univ-rennes1.fr/arthur.charpentier/fra.shp"
> M4=readShapePoly(SHP))
> plot(M4)
Notons qu’on peut importer autre chose que des régions (i.e. des polygones): on peut lire des lignes ou des points. Par exemple
> SHP="http://perso.univ-rennes1.fr/arthur.charpentier/railways.shp"
> M5=readShapeLines(SHP)
> plot(M5)
> map("france")
> lines(M5 ,col="red")
ou encore> SHP="http://perso.univ-rennes1.fr/arthur.charpentier/waterways.shp"
> M6=readShapeLines(SHP)
> plot(M6)
> map("france")
> lines(M6 ,col="blue")

Côté routes, je me contente de faire un dessin sur la Bretagne, le fichier est suffisement lourd comme ça
- Les autres formats de fond de carte
Sinon il est aussi possible d’utiliser des fichiers de type .ai. C’est
un peu plus vicieux, mais on peut les ouvrir via Adobe Image, et
ensuite les sauver... Par exemple, j’ai récupéré
le
fichier des circonscriptions électorales. On peut alors
l’utiliser pour visualiser la couleur politique du député (bon, c’est un peu
facile je sais, mais je n’ai pas d’autres idées). A suivre...Il existe aussi les fichiers dcw (Digital Chart of the World), qui se trouvent un peu partout sur internet, ici par exemple.
Beaucoup de choses se développent en ce moment sur ce sujet, par exemple ici, ou encore ici, ou là (ou même là pour des choses un peu plus techniques). A suivre donc...
PS et promis, la prochaine fois, je parle de lissage spatial...

Commentaires
Les fichiers .shp auxquel il est fait allusion, ce sont bien des "shapefiles" au format ArcView ? Dans ce cas, il est bon de préciser que c'est le standard de facto pour les fichiers SIG (bien que ce soit un format propriétaire), et que en effet la plupart des cartes au monde sont dans ce format.
La DCW (Digital Chart of the World) est, si je me souviens bien, un fichier fourni par ESRI au format shp lui aussi...
REPONSE: Merci (une nouvelle fois) Jean-François.... effectivement, ça semble correspondre à ce format... en tous les cas, la majorité des fichiers que j'ai téléchargé depuis le net (sur des pages qui évoquaient le fomat ArcView) ont été lu directement avec R. Il y a aussi beaucoup de fichiers qui trainent dans les différents packages de R, par exemple dans BARD, rgdal, spsurvey, spdep, etc.... Il faut juste faire attention car on ne sait pas si le fichier contient des régions (polygones) ou des lignes.
> library(maptools)
> SHP="D:/railways.shp"
> readShapePoly(SHP)
Erreur dans .asSpatialPolygonsShapes(Map$Shapes, IDs, proj4string = proj4string, :
Not polygon shapes
Voilà le genre d'erreurs que l'on obtient. Sinon je me suis permis de "corriger" les codes du billet en évitant de pointer vers on copie locale des fichiers, sur mon D.
Merci encore pour tes commentaires, et bon courage pour ton retour en France !
Alors, je confirme (pour les shapefiles -- pour le "bon courage" aussi, d'ailleurs, mais c'est une autre histoire). Il s'agit bien de fichiers ArcView, que j'ai lu et écrit chez moi depuis et vers ArcView. Ce qui veut dire que R peut s'interconnecter à toute la gamme d'application SIG dans les deux sens, et c'est une bonne nouvelle ! Pour donner quelques illustrations :
Toutes ces fonctions, bien sûr, existent (plutôt en plus facile d'utilisation) dans les SIG comme QGis, ArcView, GRASS... Mais la beauté du système, c'est qu'on a une interface possible entre les différents logiciels. Les SIG sont souvent un peu mauvais pour les aspects statistiques et données non spatiales (ce qui est normal !), donc la possibilité de coupler l'analyse spatiale des SIG avec l'analyse statistique de R, avec assez de recouvrement entre les deux et un format de fichier commun, est assez bluffante.
Au passage, l'extension clef c'est maptools, pas maps. maps ne sait que dessiner des fonds de carte à partir d'un format de base de données qui lui est propre, mais ne sait pas parler aux SIG...
Bonjour,
nous cherchons à projeter des données dans une carte de France.
Notre problème est que nous voulons projeter des données régionales et donc avoir une carte de la France avec les régions et non les départements.
Tu en présentes une dans ta double figure titrée : cartes-france-shp.PNG (celle de gauche).
Comment l'as tu obtenue.
Merci de ton aide.
REPONSE: je ne sais plus ! impossible de retrouver le code, désolé... je continue de chercher....