Astuce :
Créer sa carte géographique avec R

Aujourd’hui je vais vous montrer comment, en utilisant R, on peut faire de belles cartes géographiques.

Et là, vous allez me demander, mais pourquoi faire des cartes géographique ? Et pourquoi avec R ?

Et bien imaginons que, vous, bioinformaticien de terrain, soyez allé échantillonner des animaux à l’autre bout du monde sur plusieurs sites, par exemple des Marsupilami (totalement au hasard !). Vous voulez faire une carte de ces différents sites d’échantillonnage.

Facile ! Il suffit d’utiliser Google Earth, et d’y ajouter les points me direz-vous.

Oui, mais voilà, vous avez 500 points d’échantillonnage. Et 500, ça commence à faire beaucoup à faire à la main… Et puis votre chef étant un ayatollah du libre, vous venez d’être viré par le simple fait d’y avoir pensé !

Et le gros avantage d’utiliser R sera de pouvoir utiliser toutes ses fonctions graphiques sur votre carte (et puis c'est libre !). Nous verrons, à la fin de cet article, comment ajouter des graphiques sur une carte.

 

Pour faire une simple carte, on va utiliser les packages maps[1] et mapdata[2]. Une fois installés, nous utiliserons la fonction  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.

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.

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é.

 

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.

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 :

 

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.

 

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.

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().

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/

  • À propos de
  • Issu du master de bioinformatique de l'université Paris Diderot, j'ai réalisé une thèse en génomique des populations chez le poisson aveugle Astyanax mexicanus. Ancien président (2014-2017) de l'association des Jeunes Bioinformaticiens de France (RSG France - JeBiF), je suis membre du conseil de la SFBI depuis juillet 2015. @julienfumey

Catégorie: Astuce, Didacticiel | Tags: ,

14 commentaires sur “Créer sa carte géographique avec R

  1. Super!!! Tout simplement super! Merci du partage.

  2. Bonsoir, svp je voudrais construire des graphe à partir des données de Genre production cerialire dans le monde avec R ms je sais pas comment faire
    pourriez vous m'aidez c urgent
    merci
    lien http://donnees.banquemondiale.org/indicateur/AG.YLD.CREL.KG
    je prends que 8 pays de 2000 à 2013

  3. Merci!

  4. Bonsoir Mr.
    J'ai bien apprécié votre article. Vous êtes un très bon pédagogue.
    Cependant, vous n'avez pas abordé mon souci.
    Je vous l'expose dans l'espoir d'une suite favorable.
    En effet, pouvez vous faire la carte du marché commun COMESA c'est -à-dire ma mise en commun des cartes des pays qui composent COMESA?
    Prière m'indiquer toutes les étapes, les packages et les codes R.
    Merci
    Pierre

  5. Vous voulez aussi que l'on vous écrive tout le code ?
    Pour ça il vous faut le formulaire A39...
    Pour des réponses spécifique en français sur R c'est par ici (clic)

  6. Bonjour,

    Pour créer facilement une carte, j'utilise cet outil de data-viz : https://makeyourmap.cc/fr/

    Il est totalement gratuit et en 5 clics il est facile de réaliser une carte avec ses propres données excel ou avec des données en open-source.

    Je vous le recommande si vous ne souhaitez pas perdre de temps avec des outils compliqués!

  7. Bonjour

    j'ai apprécié votre enseignement. Mais je voulais savoir comment dessiner la carte du BURUNDI.

    • Il suffit d'utiliser cette commande:
      map('worldHires', "burundi", col='gray80', fill=T)

      Le nom des pays doivent être renseigner en anglais et en minuscule pour que ça fonctionne.

  8. Bonjour à vous
    Merci pour cet enseignement.
    Je voudrais savoir comment faire la carte de pays composés de plusieurs noms comme cote d'ivoire, Sao tome, Sierra Leone, Etat unis, Afrique de l’ouest, Afrique centrale, etc. Ensuite, comment associer des couleurs en fonction de certaines valeur tels que (5-10 : rouge; 10-15 : jaune ; 15 - 20 vert ; etc.)
    Merci d'avance. J’ai apprécié votre enseignement.

    • La commande pour dessiner les pays à noms composés est la même:
      map('worldHires', "sierra leone", col='gray80', fill=T)

      Les noms des pays doivent être écrit en anglais et dans les majuscules pour que ça fonctionne.

      Pour les couleurs, je n'ai pas la réponse, mais cela doit suivre les règles classiques de coloration avec R.

  9. Bonjour, vous parlez des packages map, mais je ne sais pas comment les récupérer ? Merci à vous

    • Les librairies sont sur CRAN, il faut donc les installer dans R avec la commande suivante:
      install.packages("maps")

  10. Bonjour,
    Super article !
    Je vous expose mon problème. Je souhaite colorer des polygones ( des régions). Je me demande si je dois importer des shp ou bien si on peut faire autrement...

  11. Bonjour,

    J'aimerais savoir s'il est possible sur R de séparer des pie charts qui se superposent ? En effet, pour une même position, j'ai plusieurs données différentes et donc plusieurs pie charts du coup, j'aimerais les espacer légèrement 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 possibilité de joindre une image pour illustrer ma demande.

    Merci de votre retour,
    Axelle

Laisser un commentaire