Créer sa carte géographique avec R

Aujourd’hui je vais vous mon­trer com­ment, en uti­li­sant R, on peut faire de belles cartes géo­gra­phiques.

Et là, vous allez me deman­der, mais pour­quoi faire des cartes géo­gra­phique ? Et pour­quoi avec R ?

Et bien ima­gi­nons que, vous, bio­in­for­ma­ti­cien de ter­rain, soyez allé échan­tillon­ner des ani­maux à l’autre bout du monde sur plu­sieurs sites, par exemple des Mar­su­pi­la­mi (tota­le­ment au hasard !). Vous vou­lez faire une carte de ces dif­fé­rents sites d’échantillonnage.

Facile ! Il suf­fit d’utiliser Google Earth, et d’y ajou­ter les points me direz-vous.

Oui, mais voi­là, vous avez 500 points d’échantillonnage. Et 500, ça com­mence à faire beau­coup à faire à la main… Et puis votre chef étant un aya­tol­lah du libre, vous venez d’être viré par le simple fait d’y avoir pen­sé !

Et le gros avan­tage d’utiliser R sera de pou­voir uti­li­ser toutes ses fonc­tions gra­phiques sur votre carte (et puis c'est libre !). Nous ver­rons, à la fin de cet article, com­ment ajou­ter des gra­phiques sur une carte.

 

Pour faire une simple carte, on va uti­li­ser les packages maps[1] et mapdata[2]. Une fois ins­tal­lés, nous uti­li­se­rons la fonc­tion 

map()

  pour créer notre carte. Nous utiliserons les données de la base de données worldHires fournie dans le package mapdata.

Le code suivant donne une carte du monde.

library(maps)
library(mapdata)

map('worldHires')

carte_monde

Les options graphiques de R peuvent s’appliquer. On peut choisir de ne dessiner qu'une partie du monde en utilisant les options xlim et ylim respectivement pour régler la longitude et la latitude. Il faut donc connaître les coordonnées géographique des quatre coins de la carte qui nous intéresse (elles peuvent être trouvées grâce à la fonction

locator()

  de R). L’option color permettra de modifier la couleur des frontières entre pays, et utilisée avec l’option fill, on pourra colorier les pays.

map('worldHires', col=rainbow(18), fill=T, xlim=c(-19,60), ylim=c(-40,40))

carte_afrique

 

Ouais, mais c’est chiant ton truc. Il faut connaître les coordonnées géographiques dans le système décimal pour dessiner la carte. On peut pas demander le pays que l’on veut ?

 

Et si ! On peut spécifier le pays que l’on veut dessiner. Par exemple, la commande suivante permet de dessiner une carte du Japon avec un fond grisé.

 

map('worldHires', "japan", col='gray80', fill=T)

carte_japon

Puisqu’une carte sans échelle ne veut rien dire (comment j’ai bien retenu mes cours de géographie du collège !), on utilisera la fonction 

map.scale()

  pour l’ajouter.

On peut ensuite ajouter les villes sur cette carte, grâce à la fonction

map.cities()

.

On pourra ensuite ajouter des points sur la carte à partir des coordonnées géographiques. Il faudra alors disposer de ces coordonnées géographiques dans le système décimal. Si vous avez les coordonnées dans le système sexagésimal, vous pouvez les convertir, par exemple sur ce site : https://tools.wmflabs.org/geohack/

Les coordonnées de Kyoto dans le système sexagésimal sont 35°40’14.6“N, 139°46’18.86“E (merci Wikipedia : https://fr.wikipedia.org/wiki/kyoto). Ces coordonnées donnent dans le système décimal : 35.670724°N pour la latitude et 139.771907°E pour la longitude.

map('worldHires', "japan", col='gray80', fill=T)
map.scale(134,26,metric=T, relwidth=0.3)
map.cities(country='Japan', capitals=1, pch=15, col='red')
points(135.7, 35, pch=16)
text(135.7, 35.3, label="Kyoto")
points(140.5, 37.8, pch=16)
text(140.5, 38.2, label="Fukushima")

carte_japon_avec_ville

 

Je vois d'ici les petits malins qui ont voulu, pour tester, faire une belle carte de la France métropolitaine, et qui n'ont pas été super contents du résultat…

En effet la commande

map("worldHires", "france")

  représente la France… en entier ! Donc avec les DOM-TOM (enfin les DROM-COM pour ceux qui ont suivi les changements d'acronymes).

Il faudra donc, dans le cas de la France métropolitane, passer obligatoirement par les coordonnées géographiques :

map("worldHires", "france", xlim=c(-5,10), ylim=c(35,55))

 

Maintenant revenons à nos marsupilamis. On va réaliser une carte de leur aire de répartition sur laquelle on ajoutera les points d’échantillonnage. Pour les aires de répartition d’une espèce, il est "assez facile" de trouver des données sur internet sous forme de shapefile (.shp) qui sont ceux que l’on utilise pour faire une carte.

On représente les aires de répartition de deux types de population de la même espèce de marsupilami (Marsupilami fantasii) : les marsupilamis jaunes à tâches (dont l'aire de répartition est représentée en vert) et les marsupilamis jaunes uniformes (en rouge). Sur la carte, on voit que les deux populations cohabitent sur une aire géographique limitée.

library(maptools)
repartition = readShapePoly('./repartition_marsu.shp’)
map('worldHires', xlim=c(-90,-35), ylim=c(-60,15))
plot(repartition[55,], add=TRUE, col=rgb(20,84,30,150,maxColorValue=255), border=FALSE)
plot(repartition[84,], add=TRUE, col=rgb(201,21,34,150,maxColorValue=255), border=FALSE)

 

carte_repart_marsu

Pour faire cette carte, j’ai importé une nouvelle libraire (maptools) dans laquelle se trouve la fonction

readShapePoly()

 qui permet d’ouvrir des fichiers « de forme ». J’ai récupéré le fichier concernant les "caecilian amphibians"[3] (mais ! On bossait pas sur le marsupilami ?!) sur le site de l’UICN Red List (Liste rouge des espèces en danger)[4]. Une fois ouvert avec R, vous devriez obtenir une data frame contenant une aire de répartition par ligne (et j'ai bien galéré à en trouver deux qui se recoupent).

Une légende pourrait être ajoutée en utilisant la fonction

legend()

 de R.

Maintenant intéressons-nous en particulier à la zone où les deux populations cohabitent. Sur cette carte, j’ai ajouté les treize points d’échantillonnage dans cette région (dont sept dans la zone de cohabitation). On peut ajouter ces points grâce à la fonction 

points()

  en ayant au préalable importé le fichier csv qui les contient.

Pour zoomer, j’ai cherché les coordonnées des quatre points les plus, respectivement, au nord, à l’ouest, au sud et à l’est de la zone qui m’intéresse grâce à la fonction 

locator()

  de R.

map('worldHires', xlim=c(-65.5,-50), ylim=c(-14,-8))
plot(repartition[84,], add=TRUE, col=rgb(201,21,34,150,maxColorValue=255), border=FALSE)
plot(repartition[55,], add=TRUE, col=rgb(20,84,30,150,maxColorValue=255), border=FALSE)
points(coord$x, coord$y, pch=16)

points_echant

C’est bien beau d’échantillonner des bestioles sur le terrain, mais normalement, on n'échantillonne pas pour le plaisir d'échantillonner, mais pour faire quelque chose avec cet échantillonnage… On a donc séquencé le cytochrome b des différents individus échantillonnés dans ces différentes populations, ce qui nous a permis d’identifier huit haplotypes différents.

 Hey m4rsu ! On pourrait pas faire une représentation des différents haplotypes identifiés sur chaque site et leur fréquence, genre avec un camembert ?

J'allais justement y venir !

On peut donc ajouter des graphiques en camembert sur une carte grâce à la fonction 

draw.pie()

 qui est fournie avec la librarie mapplots. Il faut disposer d’un fichier qui comporte quatre colonnes : longitude, latitude, haplotype, nombre d’observations. On pourra alors utiliser la fonction 

make.xyz()

 qui créée automatiquement un objet utilisable dans la fonction

draw.pie()

.

library(mapplots)
xyz = make.xyz(haplotypes$x, haplotypes$y, haplotypes$freq, haplotypes$haplo)
map('worldHires', xlim=c(-65.5,-50), ylim=c(-14,-8))
plot(repartition[84,], add=TRUE, col=rgb(201,21,34,150,maxColorValue=255), border=FALSE)
plot(repartition[55,], add=TRUE, col=rgb(20,84,30,150,maxColorValue=255), border=FALSE)
draw.pie(xyz$x, xyz$y, xyz$z, radius=0.3, col=rainbow(8))
legend('topright', legend=c(1:8), col=rainbow(8), pch=15, ncol=2)

haplotype

 

Tadaa ! Bon, je vous laisse faire l’interprétation (bon courage, j'ai inventé les données !), car ce n’est pas l’objet de cet article.

Nous avons donc vu comment faire des cartes avec R. N’étant pas un spécialiste, je vous ai montré quelques possibilités, mais il y en a plein d’autres, et je suis sûr que l’on peut faire des cartes bien plus belles que celles que j’ai montrées ici. Il existe plein d'autres librairies pour faire des cartes, vous devriez y trouver votre bonheur !

Pour finir, je voudrais préciser qu’aucun marsupilami n’a été maltraité pour écrire cet article. En plus, c'est un gros fake : tout le monde sait que les marsupilamis vivent dans la forêt palombienne et non amazonienne.

Merci à mathurin, hedjour, Olivier Dameron et Sylvain P. pour leurs précieux conseils et la relecture de cet article. Merci également à Kim Gilbert pour son article "Making maps with R"[5] qui m'a bien aidé à mes débuts avec les cartes.

Références

[1] Package maps : http://cran.r-project.org/web/packages/maps/

[2] Package mapdata : http://cran.r-project.org/web/packages/mapdata/index.html

[3] : shapefile des Caecilian Amphibians (ou Gymnophonia) : http://goo.gl/OFGYl1

[4] : IUCN Red List http://www.iucnredlist.org/technical-documents/spatial-data

[5] : Making map with R : http://www.molecularecologist.com/2012/09/making-maps-with-r/



Pour continuer la lecture :


Commentaires

14 réponses à “Créer sa carte géographique avec R”

  1. Avatar de Billy Mandresy
    Billy Mandresy

    Super!!! Tout sim­ple­ment super ! Mer­ci du par­tage.

  2. Bon­soir, svp je vou­drais construire des graphe à par­tir des don­nées de Genre pro­duc­tion ceria­lire dans le monde avec R ms je sais pas com­ment faire
    pour­riez vous m'aidez c urgent
    mer­ci
    lien http://​don​nees​.ban​que​mon​diale​.org/​i​n​d​i​c​a​t​e​u​r​/​A​G​.​Y​L​D​.​C​R​E​L​.KG
    je prends que 8 pays de 2000 à 2013

  3. Mer­ci !

  4. Avatar de Pierre Raymond
    Pierre Raymond

    Bon­soir Mr.
    J'ai bien appré­cié votre article. Vous êtes un très bon péda­gogue.
    Cepen­dant, vous n'avez pas abor­dé mon sou­ci.
    Je vous l'expose dans l'espoir d'une suite favo­rable.
    En effet, pou­vez vous faire la carte du mar­ché com­mun COMESA c'est ‑à-dire ma mise en com­mun des cartes des pays qui com­posent COMESA ?
    Prière m'indiquer toutes les étapes, les packages et les codes R.
    Mer­ci
    Pierre

  5. Avatar de HedJour

    Vous vou­lez aus­si que l'on vous écrive tout le code ?
    Pour ça il vous faut le for­mu­laire A39…
    Pour des réponses spé­ci­fique en fran­çais sur R c'est par ici (clic)

  6. Bon­jour,

    Pour créer faci­le­ment une carte, j'utilise cet outil de data-viz : https://​makeyour​map​.cc/​fr/

    Il est tota­le­ment gra­tuit et en 5 clics il est facile de réa­li­ser une carte avec ses propres don­nées excel ou avec des don­nées en open-source.

    Je vous le recom­mande si vous ne sou­hai­tez pas perdre de temps avec des outils com­pli­qués !

  7. Avatar de !!:;;:; ç_èè-((''"
    !!:;;:; ç_èè-((''"

    Bon­jour

    j'ai appré­cié votre ensei­gne­ment. Mais je vou­lais savoir com­ment des­si­ner la carte du BURUNDI.

    1. Il suf­fit d'utiliser cette com­mande :
      map('worldHires', "burun­di", col='gray80', fill=T)

      Le nom des pays doivent être ren­sei­gner en anglais et en minus­cule pour que ça fonc­tionne.

  8. Bon­jour à vous
    Mer­ci pour cet ensei­gne­ment.
    Je vou­drais savoir com­ment faire la carte de pays com­po­sés de plu­sieurs noms comme cote d'ivoire, Sao tome, Sier­ra Leone, Etat unis, Afrique de l’ouest, Afrique cen­trale, etc. Ensuite, com­ment asso­cier des cou­leurs en fonc­tion de cer­taines valeur tels que (5–10 : rouge ; 10–15 : jaune ; 15 — 20 vert ; etc.)
    Mer­ci d'avance. J’ai appré­cié votre ensei­gne­ment.

    1. La com­mande pour des­si­ner les pays à noms com­po­sés est la même :
      map('worldHires', "sier­ra leone", col='gray80', fill=T)

      Les noms des pays doivent être écrit en anglais et dans les majus­cules pour que ça fonc­tionne.

      Pour les cou­leurs, je n'ai pas la réponse, mais cela doit suivre les règles clas­siques de colo­ra­tion avec R.

  9. Bon­jour, vous par­lez des packages map, mais je ne sais pas com­ment les récu­pé­rer ? Mer­ci à vous

    1. Les librai­ries sont sur CRAN, il faut donc les ins­tal­ler dans R avec la com­mande sui­vante :
      install.packages("maps")

  10. Avatar de RANKOUSSI
    RANKOUSSI

    Bon­jour,
    Super article !
    Je vous expose mon pro­blème. Je sou­haite colo­rer des poly­gones ( des régions). Je me demande si je dois impor­ter des shp ou bien si on peut faire autre­ment…

  11. Avatar de Axelle

    Bon­jour,

    J'aimerais savoir s'il est pos­sible sur R de sépa­rer des pie charts qui se super­posent ? En effet, pour une même posi­tion, j'ai plu­sieurs don­nées dif­fé­rentes et donc plu­sieurs pie charts du coup, j'aimerais les espa­cer légè­re­ment pour que ma carte soit plus lisible (via des tirets par exemple). Je ne sais pas si je suis très claire. Je n'ai pas la pos­si­bi­li­té de joindre une image pour illus­trer ma demande.

    Mer­ci de votre retour,
    Axelle

Laisser un commentaire