Projections cartographiques avec R et ggplot

Projections cartographiques avec R et ggplot

Dans un billet précédent je présentais un tutoriel pour réaliser des cartes du monde avec rworldmap. Le billet passait toutefois complétement à côté d’un aspect fondamental de la cartographie: celui des projections.

Il n’y a pas de solution idéale qui permette de représenter une sphère sur une surface plate sans qu’il y ait une déformation des proportions ou des angles. L’une des projection les plus courante, celle de Mercator, reproduit correctement les angles mais déforme significativement les surfaces à mesure que l’on s’approche des pôles:

Mercator projection SW

Ainsi, dans la carte suivante, cette île glaciale qu’est le Groenland apparaît nettement plus grande que l’Australie alors qu’en réalité, c’est le contraire:

Australia-Greenland size comparison

Ce billet présente une des méthode qui permet de contrôler cet élément avec R et le package ggplot. Si vous souhaitez avoir plus d’information théorique sur le fonctionnement des projections, je recommande cette introduction de Statitique Canada.

Carte simple

Pour commencer on va charger les packages dont on aura besoin ici:

library(ggplot2)
library(sp)
library(rworldmap)
library(broom)

A présent, affichons une première carte:


world_map <- tidy(getMap())

ggplot() +
  geom_polygon(data = world_map, aes(x=long, y = lat, group = group),
               color = "black", fill = "grey70")

La fonction getMap du package rworldmap permet d'obtenir une carte du monde politique. La fonction tidy permet de convertir le polygone en dataframe afin de permettre d'ajouter facilement des données par exemple. Voici le résultat:

exemple

Sous cette forme, la carte n’est pas projeté correctement. Ainsi si je change les dimensions de l’image j’obtiens ce résulat beaucoup moins convaincant:

exemple 2

coord_equal

Pour pallier à ce problème il suffit d’ajouter l’argument coord_equal. Celui-ci s’assure que les dimensions restent bien égales pour les x et les y.

ggplot() +
  geom_polygon(data = world_map, aes(x=long, y = lat, group = group),
               color = "black", fill = "grey70") + 
  coord_equal()

Voici le résultat:

coord_equal

Cette carte n’est pas projeté mais les proportions sont conservées indépendemment des dimensions de l’image. Même si je redimensionne l’image, les proportions de la carte restent les mêmes.

Utiliser une projection

La fonction spTransform permet de transformer les coordonées d’un polygone spatial de différentes façon, l’une d’elle consiste à choisir un système de coordonnées avec l’argument CRS (coordinate reference system). Cet argument requiert une chaîne de charactère formatée selon la syntaxe de la bibliothèque « PROJ.4« . Le site de ce projet présente la syntaxe à utiliser pour certaines projections. Par exemple, pour avoir une projection de Robinson, on emploie l’argument « +proj=robin »:

world_map <- tidy(spTransform(getMap(), CRS("+proj=robin")))

ggplot() +
  geom_polygon(data = world_map, aes(x=long, y = lat, group = group),
               color = "black", fill = "grey70") +
  coord_equal()

robinson

Supprimer l’Antarctique

La carte politique que nous venons d’afficher est utile pour présenter des données qui varient en fonction du pays. L’Antarctique n’étant pas un pays, on peut souvent alléger la carte en supprimant tout simplement ce continent:

world_map <- world_map[world_map$id != "Antarctica",]

ggplot() +
  geom_polygon(data = world_map, aes(x=long, y = lat, group = group),
               color = "black", fill = "grey70") +
  coord_equal()

Robinson No Antarctica

Evidemment ce choix ne se justifie pas pour une carte qui représenterait des informations sur le climat ou la géologie par exemple.

Quelques projections atypiques

Le catalogue de PROJ.4 propose une foule de projections intéressante. Pour terminer ce billet, en voici quelques unes:

Projection de Postel

Cette projection est centrée permet d’obtenir une carte centrée sur un point en particulier, à l’inverse de la projection de Mercator qui déforme les zones proches des pôles, la projection de Postel déforme les zones les plus éloignées du point d’origine. Par défaut voici ce que l’on obtient:

world_map <- tidy(spTransform(getMap(), CRS("+proj=aeqd")))

ggplot() +
  geom_polygon(data = world_map, aes(x=long, y = lat, group = group),
               color = "black", fill = "grey70") +
  coord_equal()

Azimuthal EquidistantAzimuthal Equidistant

C’est ce que j’ai trouvé de plus proche des cartes que l’on retrouve souvent dans les pages du Monde Diplomatiques (celle-ci par exemple). On note toutefois l’importante déformation de l’Océanie.

Carte centrée sur le pôle Nord

PROJ.4 étant une synataxe, on peut y ajouter des arguments en suivants certaines règles. Il est ainsi possible de fournir un point de coordonné de base pour la projection de Postal que nous venons de voir. Chaque argument doit notamment être séparé par un espace et un « + ». Une liste des arguments disponibles peut être consulté à cette adresse. Dans notre cas, nous n’avons besoin que de définir un point de référence. On ajoutera donc un argument pour la lattitude (« lat_0 ») et un autre pour la longitude (« lon_0 ») avec les valeurs du pôle nord (lattitude 90 et longitude 0):

world_map <- tidy(spTransform(getMap(), CRS("+proj=aeqd +lat_0=90 +lon_0=0")))[world_map$id != "Antarctica",]

ggplot() +
  geom_polygon(data = world_map, aes(x=long, y = lat, group = group),
               color = "black", fill = "grey70") +
  coord_equal()

UN

Dans cette exemple, il est essentiel de supprimer l’Antarctique sinon le polygône que forme ce dernier recouvrera toute la carte.

Cette carte ne vous rappelle rien? Si? Effectivement, c’est celle qui est représenté sur le drapeau des Nations Unies:

6365386329_f24a5e7976_b

Projection centrée sur l’Océan Pacifique

Certaines cartes, notamment chinoises ou américaines, sont centrés sur le Pacifique plutôt que sur l’Europe. Pour apprendre à faire cette modification je vous renvoie à ce post de blogue qui détaille la marche à suivre.

Pacific Centered

Illustrations

Publicités

Répondre

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l'aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s