Chapitre 13 Créer des cartes avec ggplot2

13.1 Les cartes choroplèthes

Une fonction géométrique de ggplot2 permet l’utilisation de données géomatiques : geom_sf()

L’exemple suivant est une carte choroplèthe.

data("World")

tt <- World %>%
  rename(Country_or_Area_Code = iso_a3) %>%
  inner_join(
    ODD_indicateur311 %>%
      filter(Age_group == "All age ranges or no breakdown by age",
             Sex == "Both sexes or no breakdown by sex",
             Type_Zone == "Pays",
             is.na(Value_type)) %>%
      group_by(Country_or_Area_Code) %>%
      filter(!is.na(Value)) %>%
      filter(Year == max(Year)),
    by = "Country_or_Area_Code")

ggplot(data = tt) +
  geom_sf(aes(fill = Value)) +
  theme_gouv_map() + 
  scale_fill_gouv_continuous(palette = "pal_gouv_h", reverse = TRUE)

13.2 Les cartes à ronds proportionnels

La fonction stat_sf_coordinates() permet d’extraire les coordonnées d’un objet ‘sf’. Ainsi un rond proportionnel peut être attribué à un polygone.

data("World")

tt <- World %>%
  rename(Country_or_Area_Code = iso_a3) %>%
  inner_join(ODD_indicateur311 %>%
    filter(Age_group == "All age ranges or no breakdown by age",
      Sex == "Both sexes or no breakdown by sex",
      Type_Zone == "Pays",
      is.na(Value_type)) %>%
    group_by(Country_or_Area_Code) %>%
    filter(!is.na(Value)) %>%
    filter(Year == max(Year)))

ggplot(data = tt) +
  geom_sf(fill = gouv_colors("r5")) +
  theme_gouv_map() + 
  stat_sf_coordinates(aes(size = Value, fill = Value), color = "black", shape = 21) +
  scale_fill_gradient(name = "Valeur", low =  "white", high = gouv_colors("i1")) +
  scale_size_area(name = "Valeur", max_size = 10)

13.3 Les facettes

On peut exploiter de la même façon les différentes fonctions vues précédemment. Par exemple : avec un peu de thème et de facet.

data("World")

tt <- World %>%
  st_transform(4326) %>%
  rename(Country_or_Area_Code = iso_a3) %>%
  inner_join(ODD_indicateur311 %>%
    filter(Age_group == "All age ranges or no breakdown by age",
      Sex == "Both sexes or no breakdown by sex",
      Type_Zone == "Pays",
      is.na(Value_type)) %>%
    group_by(Country_or_Area_Code) %>%
    filter(!is.na(Value)) %>%
    filter(Year %in% c(1990, 2000, 2010, 2015)) %>%
    ungroup() %>%
    complete(Year)
  )

ggplot(data = tt) +
  geom_sf(aes(fill = log(Value))) +
  theme_minimal() +
  scale_fill_viridis(option = "magma",
    direction = 1,
    breaks = c(0, 1, 2, 3, 4, 5, 6, 7)) +
  guides(
    fill = guide_legend(direction = "horizontal",
      keyheight = unit(2, units = "mm"),
      keywidth = unit(20, units = "mm"),
      order = 1,
      title.position = "top",
      title.hjust = 0.5,
      nrow = 1,
      label.position = "bottom",
      label.hjust = 1)) +
  theme(legend.position = "bottom") +
  labs(fill = "Log du taux de mortalité infantile") +
  facet_wrap("Year", drop = TRUE)

13.4 Ajouter une barre d’échelle et la flèche du nord

Le package ggspatial permet d’enrichir simplement nos cartes ggplot2 avec une barre d’échelle et la flèche du nord.

Les deux fonctions qui permettent cela sont annotation_scale() et annotation_north_arrow().

L’utilisation de ces fonctions nécessitent un système de coordonnées géographiques.

data("World")

tt <- World %>%
  rename(Country_or_Area_Code = iso_a3) %>%
  inner_join(ODD_indicateur311 %>%
    filter(Age_group == "All age ranges or no breakdown by age",
      Sex == "Both sexes or no breakdown by sex",
      Type_Zone == "Pays",
      is.na(Value_type)) %>%
    group_by(Country_or_Area_Code) %>%
    filter(!is.na(Value)) %>%
    filter(Year == max(Year)))

ggplot(data = tt %>% filter(continent == "Africa")) +
  geom_sf(aes(fill = Value)) +
  annotation_scale(location = "br", line_width = .5) +
  annotation_north_arrow(location = "bl", height = unit(0.7, "cm"), width = unit(0.7, "cm"))

13.5 Ajouter des étiquettes et du texte

Les 2 fonctions geom_sf_text() et geom_sf_label() permettent respectivement d’afficher du texte et des étiquettes sur des objets de types sf

geom_sf_text :

data("World")

tt <- World %>%
  rename(Country_or_Area_Code = iso_a3) %>%
  inner_join(ODD_indicateur311 %>%
    filter(Age_group == "All age ranges or no breakdown by age",
      Sex == "Both sexes or no breakdown by sex",
      Type_Zone == "Pays",
      is.na(Value_type)) %>%
    group_by(Country_or_Area_Code) %>%
    filter(!is.na(Value)) %>%
    filter(Year == max(Year)))

ggplot(data = tt %>% filter(continent == "Africa")) +
  geom_sf(aes(fill = Value)) +
  geom_sf_text(aes(label = name), vjust = -0.5, check_overlap = TRUE, fontface = "italic", colour = "white")

geom_sf_label

ggplot(data = tt %>% filter(continent == "Africa")) +
  geom_sf(aes(fill = Value)) +
  geom_sf_label(aes(label = name))

13.6 Exercice 5

A partir des jeux de données rpls_aggrege.RData et Carte_EPCI_France.RData, produire une carte du Loiret à l’EPCI représentant le taux de logements collectifs dans le parc locatif social (variable “Logements collectifs_pourcent”).

Résultat attendu :

Note : A partir du fond de carte Carte_EPCI_FRANCE.