Chapitre 9 Créer des cartes avec ggplot2

Dans ce chapitre, nous allons utiliser les librairies suivantes.

library(sf)
library(tidyverse)
library(ggplot2)
library(patchwork)
library(lwgeom)
#remotes::install_github("MaelTheuliere/variousdata")
library(variousdata)
library(ggspatial)

9.1 Quelques rappels sur ggplot2

9.1.1 Présentation du package ggplot2

  • ggplot 2 est un package créé par Hadley Wickham et Winston Chang pour implémenter dans R la vision développée par Leland Wilkinson dans The Grammar of Graphics (Statistics and Computing) de la conception de graphiques.

  • Le but est de fournir une approche unique pour produire quasiment toute valorisation graphique de données que l’on peut trouver dans des revues scientifiques, les journaux, dans l’analyse statistique ou la data visualisation.

  • Ce package aujourd’hui s’inscrit dans R dans le framework Tidyverse qui propose une approche cohérente sur l’ensemble de la chaîne de vie de la donnée : importation, préparation des données, analyse et valorisation.

9.1.2 Le Tidyverse

le tidyverse

9.1.3 ggplot 2 : les concepts clefs

Pour construire un graphique avec ggplot il va falloir lui définir plusieurs éléments :

  • la donnée : ggplot2 permet de travailler sur des vecteurs, des dataframes, des tibbles, ou des données spatiales ;

  • le mapping : on définit dans l’aesthetic (ou aes) le mapping, c’est à dire ce que l’on veut représenter qui dépend des variables (quelle variable sur l’axe x, sur l’axe y, quelle variable pour définir une graduation de couleurs…) ;

  • les paramètres : on définit les autres paramètres qui dépendent de constantes (par exemple : je veux que toutes mes lignes soient rouges ou de taille 2 pixels) ;

  • le layer (“forme géométrique”) : on définit sous quelle représentation graphique on représente les paramètres précédents. Sous ggplot, ces fonctions sont de la forme geom_XX ;

L’écriture type d’un graphique sera donc:

ggplot(data = <DATA>) + 
  <FORME_GEO>(mapping = aes(<MAPPINGS>),...=<PARAMS>)

On va ensuite pouvoir partir de cette base pour l’enrichir avec des fonctions supplémentaires. Chaque fonction s’enchaine avec des + comme les %>%.

ggplot(data = <DATA>) + 
  <FORME_GEO>(mapping = aes(<MAPPINGS>),...=<PARAMS>)+
  <FONCTION1>+
  ...

9.1.4 Le mapping

9.1.4.1 Les paramètres du mapping

Dans l’exemple qui suit, la représentation géographique utilisée est le nuage de point geom_point(). D’autres types de représentations graphiques sont présentées dans la partie suivante.

L’aesthetic sert à identifier les variables que l’on souhaite représenter. Par exemple, si l’on souhaite représenter le taux de mortalité maternelle (Maternal_mortality_ratio) en fonction du produit intérieur brut (Gross_Domestic_Product_GDP) :

sdg_indicators %>% 
  filter(timeperiod ==2015) %>% 
  ggplot() +
    geom_point(aes(x = gdp_per_cap, y = sh_sta_mmr))

De plus, la fonction aes() admet d’autres arguments qui permettent de modifier l’apparence du graphique selon une 3ème variable du jeu de données.

  • colour : la couleur,
  • shape : la forme,
  • size : la taille,
  • alpha : la transparence,
  • fill : le remplissage ;
sdg_indicators %>% 
  filter(timeperiod ==2015) %>% 
  ggplot() +
  geom_point(aes(x = gdp_per_cap, 
                 y = sh_sta_mmr,
                 color = continent))

9.1.4.2 Les “autres” paramètres

Il est possible de spécifier des paramètres qui seront valables pour l’ensemble du graphique. On retrouve entre autre les mêmes paramètres que proposés dans l’aes mais il faut alors les passer en dehors de l’aesthetic.

Par exemple si l’on souhaite modifier la transparance et la taille de l’ensemble des points du graphique précédent:

sdg_indicators %>% 
  filter(timeperiod ==2015) %>% 
  ggplot() +
  geom_point(aes(x = gdp_per_cap, 
                 y = sh_sta_mmr,
                 color = continent),
    alpha = 0.5, 
    size = 1.9
  )

De même si l’on souhaite modifier la couleur générale:

sdg_indicators %>% 
  filter(timeperiod ==2015) %>% 
  ggplot() +
  geom_point(aes(x = gdp_per_cap, 
                 y = sh_sta_mmr),
    color = "red",
    alpha = 0.5, 
    size = 1.9
  )

Pour choisir et modifier facilement les couleurs d’un graphique, il existe un addin développé par Dean Attali: Colour Picker.

Il est installable comme n’importe quel package.

Pour plus d’informations: https://github.com/daattali/colourpicker

9.1.5 L’habillage simple

9.1.5.1 Titre et libellé des axes

Chaque nouvel élément graphique est à rajouter sous forme de layer, ici nous utilisons la fonction labs() qui permet de labelliser tout les éléments possibles de l’aesthétic, ainsi que le titre (title), le sous titre (subtitle) et le bas de page (caption)

sdg_indicators %>% 
  filter(timeperiod ==2015) %>% 
  ggplot() +
  geom_point(aes(x = gdp_per_cap, 
                 y = sh_sta_mmr,
                 color = continent),
    alpha = 0.5, 
    size = 1.9
  ) +
  labs(
    title = "Mortalité maternelle en fonction du PIB par habitant",
    subtitle = "En 2015",
    x = "PIB par habitant",
    y = "Taux de mortalité de la mère \n(pour 100 000 naissances)",
    caption = "Source : ODD / ONU"
  )

A noter qu’il existe plusieurs autres façons de spécifier ces élèments par des fonctions spécifiques: ggtitle, xlab, ylab,…

9.1.5.2 Légende

Les fonctions guide() et guides permettent de modifier finement la légende. Les guides peuvent être spécifiées dans chaque scale_ ou dans une instruction guides.

sdg_indicators %>% 
  filter(timeperiod ==2015) %>% 
  ggplot() +
  geom_point(aes(x = gdp_per_cap, 
                 y = sh_sta_mmr,
                 color = continent),
    alpha = 0.5, 
    size = 1.9
  ) +
  labs(
    title = "Mortalité maternelle en fonction du PIB par habitant",
    subtitle = "En 2015",
    x = "PIB par habitant",
    y = "Taux de mortalité de la mère \n(pour 100 000 naissances)",
    caption = "Source : ODD / ONU"
  ) +
  guides(color = guide_legend(
    direction = "horizontal",
    order = 1,
    title.position = "top",
    title.hjust = 0.5,
    nrow = 1,
    label.position = "bottom"
  )) +
  theme(legend.position = "bottom")

9.1.5.3 Annotation

Il est aussi possible de rajouter des annotations de type texte, par exemple, “à la volée”.

sdg_indicators %>% 
  filter(timeperiod ==2015) %>% 
  ggplot() +
  geom_point(aes(x = gdp_per_cap, 
                 y = sh_sta_mmr,
                 color = continent),
    alpha = 0.5, 
    size = 1.9
  ) +
  labs(
    title = "Mortalité maternelle en fonction du PIB par habitant",
    subtitle = "En 2015",
    x = "PIB par habitant",
    y = "Taux de mortalité de la mère \n(pour 100 000 naissances)",
    caption = "Source : ODD / ONU"
  ) +
  annotate("text", x = 100000, y = 2, label = "je rajoute mon texte", color = "blue")

La fonction annotate() permet aussi d’ajouter d’autres types d’annotation comme par exemple des rectangles:

sdg_indicators %>% 
  filter(timeperiod ==2015) %>% 
  ggplot() +
  geom_point(aes(x = gdp_per_cap, 
                 y = sh_sta_mmr,
                 color = continent),
    alpha = 0.5, 
    size = 1.9
  ) +
  labs(
    title = "Mortalité maternelle en fonction du PIB par habitant",
    subtitle = "En 2015",
    x = "PIB par habitant",
    y = "Taux de mortalité de la mère \n(pour 100 000 naissances)",
    caption = "Source : ODD / ONU"
  ) +
  annotate("rect", xmin = 10, xmax = Inf, ymin = -Inf, ymax = Inf, fill = "red", alpha = 0.2) +
  annotate("rect", xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = 2, fill = "green", alpha = 0.2)

9.1.6 Les thèmes

Pour modifier simplement la position de la légende, c’est la fonction theme() qu’il faut utiliser.

theme() permet de créer des templates, c’est à dire de définir tout ce qui n’est pas lié directement aux données sur un graphique, notamment:

  • la position, taille,couleur,police des éléments textuels

  • la couleur des grilles primaires et secondaires du graphique

Il existe des thèmes prédéfinis dans ggplot que l’on peut déjà utiliser. Par exemple: theme_classic(), theme_bw(), theme_dark(), …

Des packages externes permettent d’enrichir cette collection de thèmes, par exemple ggthemes ou hrbrthemes.

Lorsque l’on souhaite garder une cohérence entre plusieurs graphiques, le mieux est d’en définir un à part pour l’appeler ensuite.

9.1.6.1 Les fonctions “élément”

Elle utilise 4 types de fonctions:

  • element_text() : pour toutes les étiquettes
PARAMÈTRE VALEUR
family la famille de la police
face le type de police (“plain”, “italic”, “bold”, “bold.italic”)
colour couleur
size taille en points
hjust justification horizontale, dans [0, 1]
vjust justification verticale, dans [0, 1]
angle angle, dans [0, 360]
lineheight hauteur de ligne (pour l’espacement entre les lignes)
  • element_rect() : pour les fonds et les cadres,
PARAMÈTRE VALEUR
fill la couleur de remplissage
colour la couleur de la bordure
size la taille de la bordure
linetype le type de ligne (“blank”, “solid”, “dashed”, “dotted”, “dotdash”, “longdash”, "twodash)
  • element_line() : pour toutes les lignes tracées,
PARAMÈTRE VALEUR
colour la couleur de ligne
size la taille
linetype le type de ligne (“blank”, “solid”, “dashed”, “dotted”, “dotdash”,“longdash”, "twodash)
lineend le type de fin de ligne (“round”, “butt” ou “square”)
  • element_blank() : permet de ne rien dessiner.

9.1.6.2 Les composantes

Il s’agit des différents éléments modifiables dans le thème. Par exemple:

Axes axis.line, axis.text.x, axis.text.y, axis.ticks, axis.title.x, axis.title.y,…

Légende legend.background, legend.key, legend.text, legend.title,…

Fond de graphe panel.background, panel.border, panel.grid.major, panel.grid.minor,…

etc

9.1.6.3 Quelques exemples

  • Changer le fond du graphique panel_background()
sdg_indicators %>% 
  filter(timeperiod ==2015) %>% 
  ggplot() +
  geom_point(aes(x = gdp_per_cap, 
                 y = sh_sta_mmr,
                 color = continent),
    alpha = 0.5, 
    size = 1.9
  ) +
  labs(
    title = "Mortalité maternelle en fonction du PIB par habitant",
    subtitle = "En 2015",
    x = "PIB par habitant",
    y = "Taux de mortalité de la mère \n(pour 100 000 naissances)",
    caption = "Source : ODD / ONU"
  ) +
  theme(panel.background = element_rect(fill = "Lavender", colour = "black"))

  • Changer l’apparence du quadrillage : panel_background()
sdg_indicators %>% 
  filter(timeperiod ==2015) %>% 
  ggplot() +
  geom_point(aes(x = gdp_per_cap, 
                 y = sh_sta_mmr,
                 color = continent),
    alpha = 0.5, 
    size = 1.9
  ) +
  labs(
    title = "Mortalité maternelle en fonction du PIB par habitant",
    subtitle = "En 2015",
    x = "PIB par habitant",
    y = "Taux de mortalité de la mère \n(pour 100 000 naissances)",
    caption = "Source : ODD / ONU"
  ) +
  theme(panel.grid.major = element_line(colour = "gray", size = 0.5, linetype = "dashed"))

  • Changer l’apparence des étiquettes des axes : axis_xxx()
sdg_indicators %>% 
  filter(timeperiod ==2015) %>% 
  ggplot() +
  geom_point(aes(x = gdp_per_cap, 
                 y = sh_sta_mmr,
                 color = continent),
    alpha = 0.5, 
    size = 1.9
  ) +
  labs(
    title = "Mortalité maternelle en fonction du PIB par habitant",
    subtitle = "En 2015",
    x = "PIB par habitant",
    y = "Taux de mortalité de la mère \n(pour 100 000 naissances)",
    caption = "Source : ODD / ONU"
  ) +
  theme(
    axis.text.x = element_text(colour = "blue", angle = 45),
    axis.title = element_text(face = "bold", colour = "orange")
  )

Certains changements de paramètres ne nécessitent pas l’utilisation de fonctions element_(). Par exemple, pour changer la position de la légende : legend.xxx()

sdg_indicators %>% 
  filter(timeperiod ==2015) %>% 
  ggplot() +
  geom_point(aes(x = gdp_per_cap, 
                 y = sh_sta_mmr,
                 color = continent),
    alpha = 0.5, 
    size = 1.9
  ) +
  labs(
    title = "Mortalité maternelle en fonction du PIB par habitant",
    subtitle = "En 2015",
    x = "PIB par habitant",
    y = "Taux de mortalité de la mère \n(pour 100 000 naissances)",
    caption = "Source : ODD / ONU"
  ) +
  theme(legend.position = "left", legend.title = element_blank())

9.1.6.4 Modifier le thème par défaut.

La fonction theme_set() vous permet de définir un thème par défaut pour l’ensemble de vos graphiques.

theme_set(theme_dark())

sdg_indicators %>% 
  filter(timeperiod ==2015) %>% 
  ggplot() +
  geom_point(aes(x = gdp_per_cap, 
                 y = sh_sta_mmr,
                 color = continent),
    alpha = 0.5, 
    size = 1.9
  ) +
  labs(
    title = "Mortalité maternelle en fonction du PIB par habitant",
    subtitle = "En 2015",
    x = "PIB par habitant",
    y = "Taux de mortalité de la mère \n(pour 100 000 naissances)",
    caption = "Source : ODD / ONU"
  )

9.1.6.5 Créer son propre thème

Un thème est une fonction R qui va prendre en paramètre des éléments que vous souhaitez pouvoir faire varier et fixer des éléments que vous souhaitez avoir comme rendu par défaut.

Créons ici un thème avec un fond vert pour le ministère de la transition écologique et solidaire. On rajoute un paramètre pour la taille de la police du titre du graphique.

theme_mtes <- function(taille_police = 14) {
  theme_bw() +
    theme(
      plot.title = element_text(color = "white", size = taille_police, face = "bold"),
      text = element_text(color = "white"),
      axis.text = element_text(color = "white"),
      panel.background = element_rect(fill = "lightgreen", colour = "lightgreen"),
      plot.background = element_rect(fill = "#006400", colour = "lightgreen"),
      legend.background = element_rect(fill = "lightgreen", colour = "lightgreen"),
      legend.key = element_blank()
    )
}

sdg_indicators %>% 
  filter(timeperiod ==2015) %>% 
  ggplot() +
  geom_point(aes(x = gdp_per_cap, 
                 y = sh_sta_mmr,
                 color = continent),
    alpha = 0.5, 
    size = 1.9
  ) +
  labs(
    title = "Mortalité maternelle en fonction du PIB par habitant",
    subtitle = "En 2015",
    x = "PIB par habitant",
    y = "Taux de mortalité de la mère \n(pour 100 000 naissances)",
    caption = "Source : ODD / ONU"
  ) +
  theme_mtes()

9.1.7 Les scales

Les fonctions scales() permettent globalement de paramétrer les éléments rentrés dans l’aesthétic :

  • Si je veux un gradient de couleurs fonction d’une variable continue : quelle palette de couleurs je choisie, comment je cale mon dégradé en fonction de cette variable continue ?

  • Si je met une variable continue en ordonnée, comment je définis le minimum et maximum de cette axe, sa position, les valeurs que j’affiche sur l’échelle…

L’ensemble des scales possibles peuvent se décrire sous la forme suivante:

scale_xx_yy()

ou xx peut être un des paramètres de l’aesthétic :

xx description
alpha transparence
color couleur des lignes ou des points
fill couleurs des aires
linetype type de ligne (continue,pointillée,…)
shape forme des points
size aire des points
x variable de l’axe x
y variable de l’axe y

Et yy un type de paramétrage :

yy description
continuous gérer les variables continue
discrete gérer les variables discrètes
date gérer une variable au format date
reverse inverser l’axe
log convertire l’échelle d’une variable continue en échelle logarithmique
log10 convertire l’échelle d’une variable continue en échelle logarithmique décimale
viridis utiliser une palette de couleur viridis
brewer utiliser une palette de couleur brewer (variable discrète)
distiller utiliser une palette de couleur brewer (variable continue)
gradient utiliser un gradient de 2 couleurs
gradient2 utiliser un gradient divergent de 3 couleurs
sdg_indicators %>% 
  filter(timeperiod ==2015) %>% 
  ggplot() +
  geom_point(aes(x = gdp_per_cap, 
                 y = sh_sta_mmr,
                 color = continent),
    alpha = 0.5, 
    size = 1.9
  ) +
  labs(
    title = "Mortalité maternelle en fonction du PIB par habitant",
    subtitle = "En 2015",
    x = "PIB par habitant",
    y = "Taux de mortalité de la mère \n(pour 100 000 naissances)",
    caption = "Source : ODD / ONU"
  ) +
  scale_color_brewer(type = "qual")

Par exemple on peut exploiter une fonction scale pour définir une échelle logarithimique sur un axe.

sdg_indicators %>% 
  filter(timeperiod ==2015) %>% 
  ggplot() +
  geom_point(aes(x = gdp_per_cap, 
                 y = sh_sta_mmr,
                 color = continent),
    alpha = 0.5, 
    size = 1.9
  ) +
  labs(
    title = "Mortalité maternelle en fonction du PIB par habitant",
    subtitle = "En 2015",
    x = "PIB par habitant",
    y = "Taux de mortalité de la mère \n(pour 100 000 naissances)",
    caption = "Source : ODD / ONU"
  ) +
  scale_color_brewer(type = "qual") +
  scale_x_log10() +
  scale_y_log10()

9.1.7.1 Formatage spécifique

  • Transformation en pourcentage;
  scale_y_continuous(labels = scales::percent)
  • Ajout du séparateur des milliers;
scale_y_continuous(labels = function(x) format(x, big.mark = " ", scientific = FALSE))
  • Ajout du symbole €;
scale_y_continuous(labels = function(x) paste(x, " €"))

9.1.8 La mise en page de plusieurs graphiques

Le package cowplot permet la combinaison de plusieurs graphiques. Il est composé de plusieurs fonctions.

  • le fonction plot_grid() qui permet de disposer n graphes sur i colonnes et j lignes
gg1 <- sdg_indicators %>% 
  filter(timeperiod ==2015) %>% 
  ggplot() +
  geom_point(aes(x = gdp_per_cap, 
                 y = sh_sta_mmr,
                 color = continent),
    alpha = 0.5, 
    size = 1.9
  ) +
  labs(
    title = "Mortalité maternelle en fonction du PIB par habitant",
    subtitle = "En 2015",
    x = "PIB par habitant",
    y = "Taux de mortalité de la mère \n(pour 100 000 naissances)",
    caption = "Source : ODD / ONU"
  ) +
  scale_x_log10() +
  scale_y_log10() +
  theme(axis.title = element_text(size = 9))

  gg2 <- sdg_indicators %>% 
    filter(timeperiod ==2015) %>% 
    ggplot()+
    geom_density(aes(x=gdp_per_cap))+
    scale_x_log10()

plot_grid(gg1, gg2, ncol = 1, nrow = 2)

  • la fonction draw_plot() associée à ggdraw() qui permet de disposer les graphiques à des places spécifiques.

ggdraw() initialise le graphique

gg3 <- sdg_indicators %>% 
    filter(timeperiod == 2015) %>% 
    ggplot() +
    geom_bar(aes(x = continent, fill = continent)) +
  theme(
    axis.title.x = element_blank(),
    axis.text.x = element_blank()
  )
ggdraw() +
  draw_plot(gg1, x = 0, y = .5, width = 1, height = .5) +
  draw_plot(gg2, x = 0, y = 0, width = .3, height = .5) +
  draw_plot(gg3, x = 0.3, y = 0, width = 0.7, height = .5)

9.1.9 Les facettes

Lorsque l’on veut pouvoir réaliser un graphique pour plusieurs sous-ensembles, les facettes sont alors très utiles. On va ici l’illustrer avec la réalisation du même graphique ci-dessus mais pour plusieurs années différentes.

sdg_indicators %>% 
  filter(timeperiod  %in% c(2000, 2005, 2010, 2015),
         geoareaname %in% c("France","Canada","Burkina Faso","China","Australia")) %>%
  ggplot() +
  geom_bar(aes(x = geoareaname, weight = sh_sta_mmr, fill = continent)) +
  theme_minimal() +
  scale_fill_viridis_d() +
  coord_flip() +
  scale_y_log10()+
  labs(
    title = "Mortalité maternelle sur quelques pays",
    subtitle = "En 2015",
    y = "Taux de mortalité de la mère \n(pour 100 000 naissances), échelle logarithmique",
    x = "Pays",
    fill = "Pays"
  ) +
  theme(legend.position = "none") +
  facet_wrap(~timeperiod)

L’exemple pris ici “scinde” notre table en fonction d’une seule variable, mais on peut le faire sur plusieurs variables également.

On peut choisir avec facet_wrap() :

  • le nombre de colonnes ou de ligne sur lesquel on veut voir s’afficher le graphique
  • si on veut fixer l’échelle de l’un ou l’autre des axes ou les deux
sdg_indicators %>% 
  filter(timeperiod  %in% c(2000, 2005, 2010, 2015),
         geoareaname %in% c("France","Canada","Burkina Faso","China","Australia")) %>%
  ggplot() +
  geom_bar(aes(x = geoareaname, weight = sh_sta_mmr, fill = continent)) +
  theme_minimal() +
  scale_fill_viridis_d() +
  coord_flip() +
  scale_y_log10()+
  labs(
    title = "Mortalité maternelle sur quelques pays",
    subtitle = "En 2015",
    y = "Taux de mortalité de la mère \n(pour 100 000 naissances), échelle logarithmique",
    x = "Pays",
    fill = "Pays"
  ) +
  theme(legend.position = "none") +
  facet_wrap(~timeperiod, ncol = 4)

9.1.10 Exporter un graphique

ggplot contient une fonction ggsave() qui permet d’exporter nos graphiques au format image dans les formats suivants : eps, ps, tex (pictex), pdf, jpeg, tiff, png, bmp, svg or wmf

p <- sdg_indicators %>% 
  filter(timeperiod  %in% c(2000, 2005, 2010, 2015),
         geoareaname %in% c("France","Canada","Burkina Faso","China","Australia")) %>%
  ggplot() +
  geom_bar(aes(x = geoareaname, weight = sh_sta_mmr, fill = continent)) +
  theme_minimal() +
  scale_fill_viridis_d() +
  coord_flip() +
  scale_y_log10()+
  labs(
    title = "Mortalité maternelle sur quelques pays",
    subtitle = "En 2015",
    y = "Taux de mortalité de la mère \n(pour 100 000 naissances), échelle logarithmique",
    x = "Pays",
    fill = "Pays"
  ) +
  theme(legend.position = "none") +
  facet_wrap(~timeperiod, ncol = 4)

ggsave("figures/Mortalité maternelle sur quelques pays du globe.svg", p, width = 12, height = 5)

9.2 Faire des cartes avec ggplot2

9.2.1 Les cartes choroplèthe

ggplot2 intègre une fonction geom permettant l’utilisation de données géomatrique : geom_sf()

Celle ci doit se coupler avec la fonction coord_sf() qui permet de s’assurer en cas de superposition de couches que celles-ci utiliseront bien le même crs en spécifiant le datum. coord_sf() permet également de zoomer sur la carte en spécifiant les bornes x et y de la carte, ou également de définir les labels des axes.

Le premier exemple que nous allons pouvoir voir, c’est une carte choroplèthe.

Pour cela, préalablement, nous allons intégrer à nos données un fond de carte : le spatial dataframe World présent dans le package tmap

data("World")

sdg_indicators_sf <- World %>%
  left_join(sdg_indicators)
map_sdg_indicators <- sdg_indicators_sf %>% 
  filter(timeperiod == "2015") %>% 
  ggplot() +
  geom_sf(aes(fill = log(sh_sta_mmr)),color="white",size=.2)+
  scale_fill_viridis_c()+
  theme_minimal()+
  theme(panel.background = element_rect(fill = "light blue"))
map_sdg_indicators

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

sdg_indicators_sf %>% 
  filter(timeperiod %in% c("2000","2005","2010","2015")) %>% 
           ggplot() +
           geom_sf(aes(fill = log(sh_sta_mmr)),color="white",size=.2)+
           scale_fill_viridis_c(
             option = "magma",
             direction = 1,
             breaks = c(0, 1, 2, 3, 4, 5, 6, 7))+
           guides(
             colour = F,
             order = 0,
             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_minimal()+
           theme(legend.position = "bottom",
                 panel.background = element_rect(fill = "light blue"))+
           labs(fill = "Taux de mortalité infantile (échelle logarithmique)") +
           facet_wrap(~timeperiod, drop = T)

9.2.2 Les cartes à ronds proportionnels

ggplot ne peut attribuer par défaut un rond proportionnel à un polygone.

Pour travailler sur des ronds proportionnels, il faut d’abord créer le centroid de nos zones et ensuite tracer un rond proportionnel avec geom_sf().

World_centroid <- st_centroid(World, of_largest_polygon = T)
sdg_indicators_sf_centroid <- World_centroid %>%
  left_join(sdg_indicators)

map_sdg_indicators_centroid <- sdg_indicators_sf_centroid %>% 
  filter(timeperiod == "2015",!is.na(sh_sta_mmr)) %>% 
  ggplot() +
  geom_sf(data = World, fill = "white") +
  geom_sf(aes(color = sh_sta_mmr, size = sh_sta_mmr))+
  theme_minimal()+
  theme(panel.background = element_rect(fill = "light blue"))

map_sdg_indicators_centroid

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

sdg_indicators_sf %>%
  filter(timeperiod == "2015") %>%
  st_transform(crs = 4326) %>%
  ggplot() +
  geom_sf(aes(fill = log(sh_sta_mmr)), color = "white", size = .2) +
  coord_sf(crs = 4326) +
  scale_fill_viridis_c() +
  theme_minimal() +
  theme(panel.background = element_rect(fill = "light blue")) +
  annotation_scale(location = "br", line_width = .5) +
  annotation_north_arrow(location = "bl", height = unit(0.7, "cm"), width = unit(0.7, "cm"))

9.2.4 Mettre plusieurs cartes côte à côte

On peut a partir d’une même carte vouloir réaliser un zoom sur une sous partie de celle-ci. coord_sf() va nous permettre de zoomer sur une carte, et cow_plot() va nous permettre d’afficher nos deux cartes côte à côte.

Pour zoomer sur une carte,coord_sf() va avoir besoin des coordonnées x et y du cadre sur lequel on veut zoomer. Le plus simple pour cela est de filtrer préalablement notre spatial dataframe et de récupérer la bbox de celle-ci.

Filtrons par exemple sur le continent africain.

bbox_africa <- World %>% 
  filter(continent=="Africa") %>% 
  st_bbox()

On peut ensuite réaliser une carte zoomée sur l’Afrique.

map_sdg_indicators_africa <- sdg_indicators_sf %>%
  filter(timeperiod == "2015") %>%
  ggplot() +
  geom_sf(aes(fill = log(sh_sta_mmr)), color = "white", size = .2) +
  coord_sf(xlim = c(bbox_africa[1],bbox_africa[3]),
           ylim = c(bbox_africa[2],bbox_africa[4])
           ) +
  scale_fill_viridis_c() +
  theme_minimal() +
  theme(legend.position = "right", panel.background = element_rect(fill = "light blue"))

On peut utiliser ensuite plot_grid() pour afficher nos cartes côte à côte. Il faut jouer sur les largeurs relatives pour que les deux cartes s’agencent bien.

map_sdg_indicators_compo <- map_sdg_indicators +
  theme_void()+
  theme(panel.background = element_rect(fill = "light blue"),legend.position = "none")
plot_grid(map_sdg_indicators_compo,map_sdg_indicators_africa,rel_widths = c(1.7, 1))