6.2 Annotation de carte

L’annotation de carte consiste à ajouter des couches d’information par-dessus le fond de carte. C’est bien évidemment ces fonctions d’annotation qui font tout l’intérêt des SIG, ainsi que des cartes générées dans R.

6.2.1 Labels et textes

Afin qu’une carte soit plus compréhensible, nous ajoutons des informations sous la forme de labels avec geom_sf_label() ou de texte avec geom_sf_text(). Il faut être particulièrement attentif à la taille du texte (contrôlable avec size=). Concentrons-nous maintenant sur l’Afrique australe.

africa_sa %>.%
  filter(., name %in% southern_africa) ->
  s_africa_sa

Pour les Européens, par exemple, cette zone du monde est difficilement reconnaissable telle quelle. L’ajout du nom des pays est donc une information utile pour la situer.

chart(data = s_africa_sa) +
  geom_sf() +
  geom_sf_text(aes(label = name), size = 3) +
  annotation_north() +
  labs(x = "", y = "")

6.2.2 Couches supplémentaires sf

Nous pouvons superposer plusieurs objets sf sur une même carte pour rendre l’information sous forme de couches successives. Ces objets sf peuvent contenir des polygones comme nous l’avons vu jusqu’ici, mais ils peuvent aussi contenir d’autres objets comme des points caractérisés par leurs coordonnées latitudes et longitudes.

À titre d’illustration, nous allons ajouter une couche à la carte de l’Afrique du Sud qui localise les capitales des différents pays. Les capitales ainsi que leurs latitudes et longitudes en coordonnées de degrés décimaux8. Les capitales des pays d’Afrique australe sont d’abord encodées dans un tableau classique et nommé s_capitals :

s_capitals <- dtx(
  country = c("Botswana", "Lesotho", "Namibia", "South Africa", "Swaziland"),
  capital = c("Gaborone", "Maseru", "Windhoek",     "Pretoria",   "Lobamba"),
  lat     = c(  -24.7356, -29.3906,   -22.6406,       -25.8209,    -26.5431),
  lon     = c(   25.9113,  27.5015,    17.0782,        28.1909,     31.2012)
)
s_capitals
#         country  capital      lat     lon
#          <char>   <char>    <num>   <num>
# 1:     Botswana Gaborone -24.7356 25.9113
# 2:      Lesotho   Maseru -29.3906 27.5015
# 3:      Namibia Windhoek -22.6406 17.0782
# 4: South Africa Pretoria -25.8209 28.1909
# 5:    Swaziland  Lobamba -26.5431 31.2012

Le tableau s_capitals doit ensuite être converti en objet sf avec la fonction st_as_sf() que nous avions déjà utilisée plus haut avant de pouvoir être employé pour annoter la carte . Nous devons préciser ici quelles variables représentent les coordonnées des points à l’aide de coords= et aussi indiquer quel crs= nous souhaitons utiliser.

(s_capitals_sa <- st_as_sf(s_capitals, coords = c("lon", "lat"), crs = 4326))
# Simple feature collection with 5 features and 2 fields
# Geometry type: POINT
# Dimension:     XY
# Bounding box:  xmin: 17.0782 ymin: -29.3906 xmax: 31.2012 ymax: -22.6406
# Geodetic CRS:  WGS 84
#        country  capital                 geometry
# 1     Botswana Gaborone POINT (25.9113 -24.7356)
# 2      Lesotho   Maseru POINT (27.5015 -29.3906)
# 3      Namibia Windhoek POINT (17.0782 -22.6406)
# 4 South Africa Pretoria POINT (28.1909 -25.8209)
# 5    Swaziland  Lobamba POINT (31.2012 -26.5431)

Nous constatons que le tableau a été transformé. Nos colonnes lat et lon ont disparu et une colonne geometry a été calculée. Cette colonne contient des objets sfc_POINT qui représentent, comme leur nom le suggère, des points sur la carte. À ce stade, geom_sf() est capable d’utiliser l’information contenue dans cet objet sf pour annoter la carte.

chart(data = s_africa_sa) +
  geom_sf(fill = "white") +
  geom_sf(data = s_capitals_sa) +
  annotation_north()

Et bien sûr, nous pouvons aussi ajouter le nom de ces capitales sur la carte comme ceci :

chart(data = s_africa_sa) +
  geom_sf(fill = "white") +
  geom_sf(data = s_capitals_sa) +
  geom_sf_label(data = s_capitals_sa, aes(label = capital),
    size = 3, fill = "lightgray", hjust = 1, vjust = 0.5) +
  annotation_north()

Notez que, à chaque addition d’une couche sur le graphique à l’aide de l’opérateur +, vous êtes libres de redéfinir les données (data=), ou des propriétés (on dit aussi des “esthétiques”) telles que fill=. Les données et les esthétiques fournies via la formule dans chart() constituent des valeurs par défaut utilisées si elles ne sont pas redéfinies explicitement à chaque appel des fonctions geom_xxx(). Donc ici nous utilisons deux fois geom_sf() successivement, mais l’effet est très différent, car pour la première nous utilisons les données par défaut définies dans chart() (s_africa_sa), alors qu’au second appel, nous redéfinissons les données comme étant s_capitals_sa. De même, pour geom_sf_label() nous sommes obligés de repréciser data = s_capitals_sa sinon la fonction utilise à nouveau les données par défaut s_africa_sa. Vous imaginez aisément l’immense flexibilité que ce système autorise, en particulier pour la superposition de couches d’informations complémentaires fournies via divers objets sf sur vos cartes.

6.2.3 Variables supplémentaires

La coloration de zones d’intérêts est très utilisée en cartographie afin de faire ressortir de l’information. C’est très facile à faire avec R. Il suffit d’avoir ajouté des variables supplémentaires dans notre tableau sf et de les utiliser pour le remplissage ou la couleur du trait des polygones. On va utiliser cette méthode pour comparer des zones entre elles. Le graphique ci-dessous compare les densités de population en fonction des pays du continent africain. Il faut donc associer à chaque zone une valeur soit qualitative, soit quantitative. Nous pouvons, par exemple, observer que le pays le plus peuplé est le Nigeria si nous colorons les pays par la variable quantitative pop_est.

chart(data = africa_sa, ~ 0 %fill=% pop_est) +
  geom_sf()

Dans la version précédente, nous indiquions toutes les esthétiques directement dans la formule fournie à chart(). Mais nous pouvons également les fournir individuellement à chaque appel de geom_sf(). Il faut alors les fournir via aes(). Cette méthode est même beaucoup plus compréhensible lorsque nous allons superposer différentes couches sur la carte. Ainsi, le code suivant donne exactement le même résultat.

chart(data = africa_sa) +
  geom_sf(aes(fill = pop_est))

Nous pouvons naturellement aussi utiliser des variables qualitatives pour colorer nos polygones. Si nous nous intéressons au niveau de développement économique des pays africains, nous utiliserons la variable economy à sept modalités.

levels(africa_sa$economy)
# [1] "1. Developed region: G7"    "2. Developed region: nonG7"
# [3] "3. Emerging region: BRIC"   "4. Emerging region: MIKT"  
# [5] "5. Emerging region: G20"    "6. Developing region"      
# [7] "7. Least developed region"

Sur la carte suivante, nous observons que l’Afrique du Sud, le Zimbabwe, le Kenya, le Nigeria et l’Égypte sont les pays les plus développés du continent africain. Notez que nous avons changé l’échelle de couleurs à l’aide de scale_fill_viridis_d() ici.

chart(data = africa_sa) +
  geom_sf(aes(fill = economy)) +
  scale_fill_viridis_d()


  1. Les coordonnées latitude et longitudes sont d’habitude exprimées en degrés minutes secondes. Par contre, sur ordinateur, la forme de degrés décimaux est plus pratique. Les fractions de degrés sont représentées sous forme décimale, ce qui fait que la coordonnée peut être stockée dans un objet numeric classique (voir ici). Des convertisseurs en ligne existent pour transformer les coordonnées d’un système à l’autre.↩︎