-
Notifications
You must be signed in to change notification settings - Fork 3
/
12-creer-des-cartes-pour-le-web.Rmd
268 lines (205 loc) · 10.4 KB
/
12-creer-des-cartes-pour-le-web.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
# Créer des cartes pour le web {#creer-des-cartes-pour-le-web}
## Les cartes Leaflet
[`{leaflet}`](https://leafletjs.com/) est une bibliothèque javascript de cartographie en ligne.
R permet de produire des cartes en exploitant cette bibliothèque.
La limitation de `{leaflet}` est qu'il ne permet de visualiser que des données en projection WGS84.
Dans ce chapitre, nous utiliserons les packages suivants
```{r pkg_chap_15_carto_web, message=FALSE, warning=FALSE}
# CRAN
library(htmltools)
library(htmlwidgets)
library(leaflet)
library(sf)
library(tidyverse)
# Github
library(COGiter) # remotes::install_github("MaelTheuliere/COGiter")
library(ggiraph)
# Gitlab-forge
library(mapfactory) # remotes::install_gitlab("dreal-pdl/csd/mapfactory", host = "gitlab-forge.din.developpement-durable.gouv.fr")
```
Les données utilisées sont issues de `{COGiter}`.
### Carte choroplète
Ci-dessous un exemple avancé de carte choroplète avec `{leaflet}`.
- Définition des données de départ :
```{r}
pop2015_dep_geo <- pop2015 %>%
# mise à jour du COG et agrégation à l'échelle départementale
cogifier(code_commune = DEPCOM, communes = FALSE, epci = FALSE, departements = TRUE, regions = FALSE, metro = FALSE) %>%
inner_join(COGiter::departements_geo, ., by = c("DEP" = "CodeZone")) %>%
mutate(densite = pop2015 / as.numeric(AREA) * 1000000) %>%
filter(substr(DEP, 1, 2) != "97")
glimpse(pop2015_dep_geo)
```
- Transformation de la projection car `leaflet` ne connait que le WGS 84 :
```{r}
pop2015_dep_geo <- st_transform(pop2015_dep_geo, crs=("+proj=longlat +datum=WGS84 +no_defs"))
```
- Discrétisation de la variable d'intérêt :
```{r}
bornes <- quantile(pop2015_dep_geo$densite, na.rm = TRUE)
```
- Création d'une palette de couleurs associée :
`{leaflet}` intègre une fonction `colorBin()` qui permet d'associer à un vecteur de valeurs numériques un vecteur de couleurs en fonction d'une palette et d'un vecteur de bornes.
```{r}
pal <- colorBin("YlOrRd", domain = pop2015_dep_geo$densite, bins = bornes)
```
- Création d'étiquettes popover, à afficher en surbrillance au passage de la souris sur la carte :
```{r}
popover <- sprintf("<strong>%s</strong><br/>%.1f habitants par km² en 2015",
pop2015_dep_geo$Zone, pop2015_dep_geo$densite) %>%
lapply(htmltools::HTML)
```
- Réalisation de la carte :
La fonction `addPolygons()` permet de créer la carte choroplète.
La fonction `addProviderTiles()` permet de rajouter un fond cartographique parmis les couches fournies par `leaflet`.
```{r, fig.width=7, fig.height=4}
leaflet(pop2015_dep_geo) %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addPolygons(data = pop2015_dep_geo,
fillColor = ~pal(densite),
weight = 2,
opacity = 1,
color = "white",
dashArray = "3",
fillOpacity = 0.7,
highlight = highlightOptions(
weight = 5,
color = "#666",
dashArray = "",
fillOpacity = 0.7,
bringToFront = TRUE),
label = popover,
labelOptions = labelOptions(
style = list("font-weight" = "normal", padding = "3px 8px"),
textsize = "15px",
direction = "auto"))
```
### Carte à ronds proportionnels
Pour réaliser des ronds proportionnels, il va faut partir des centroïdes de nos polygones.
On cherche cette fois à représenter les populations 2015.
- Création de la table en entrée :
```{r}
dep_centr <- st_centroid(pop2015_dep_geo)
```
- Discrétisation de la variable d'intérêt :
```{r}
bornes <- quantile(dep_centr$pop2015 / 1000, na.rm = TRUE)
```
- Création d'une palette de couleurs associée :
```{r}
pal <- colorBin("YlOrRd", domain = dep_centr$pop2015 / 1000, bins = bornes)
```
- Création d'un label ad-hoc à afficher en surbrillance au passage de la souris sur la carte :
```{r}
popover <- sprintf("<strong>%s</strong><br/>%.1f milliers habitants en 2015",
dep_centr$Zone, dep_centr$pop2015 / 1000) %>%
lapply(htmltools::HTML)
```
- Création de la carte :
```{r, fig.width=7, fig.height=4}
carte_rond_proportionnel <- leaflet(dep_centr) %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addCircles(data = dep_centr,
fillColor = ~pal(pop2015 / 1000),
radius = ~2500*log(pop2015),
weight = 2,
opacity = 1,
color = "gray",
dashArray = "3",
fillOpacity = 0.6,
highlight = highlightOptions(
weight = 5,
color = "#666",
dashArray = "",
fillOpacity = 0.98,
bringToFront = TRUE),
label = popover,
labelOptions = labelOptions(
style = list("font-weight" = "normal", padding = "3px 8px"),
textsize = "15px",
direction = "auto")) %>%
addLegend("bottomright", pal = pal, values = ~pop2015,
title = "Nombre d'habitants en 2015 - INSEE - RP",
opacity = 1)
carte_rond_proportionnel
```
## Les cartes ggplot
Les cartes créées par {ggplot2}, comme tous les autres graphiques produits avec ggplot d'ailleurs, peuvent être rendues dynamiques [grâce à {ggiraph}](https://davidgohel.github.io/ggiraph) développé par David Gohel.
<img src="https://davidgohel.github.io/ggiraph/reference/figures/logo.png" align="right" width="180"/>
Ce package permet l'ajout d'info-bulles, des effets de survol et d'ajouter des actions JavaScript aux graphiques.
L'interactivité est s'applique aux géométries ggplot, aux légendes et aux éléments de thème, grâce aux paramètres esthétiques suivants :
* `tooltip`: info-bulles à afficher lorsque la souris se trouve sur les éléments ;
* `onclick`: fonction JavaScript à exécuter lorsque les éléments sont cliqués ;
* `data_id`: id à associer aux éléments (utilisé pour les actions de survol et de clic).
Les choses que vous devez savoir pour créer un graphique interactif :
* Au lieu d'utiliser `geom_sf()`, utilisez `geom_sf_interactive()`, au lieu d'utiliser `geom_sf_label()`, utilisez `geom_sf_label_interactive()`... Fournissez au moins une des esthétiques `tooltip`, `data_id` and `onclick` pour créer des éléments interactifs.
* Appelez la fonction girafe avec l'objet ggplot afin que le graphique soit traduit en un graphique web interactif.
```{r, include=FALSE}
pop2015_preparee <- pop2015 %>%
# mise à jour du COG et agrégation aux différentes échelles adm
cogifier(code_commune = DEPCOM, communes = TRUE, epci = TRUE, departements = TRUE, regions = TRUE, metro = FALSE) %>%
# on filtre le jeu de données pour ne garder que les territoires de Normandie et toutes les régions
filtrer_cog(reg = "28", garder_supra = ">=")
# Aperçu du jeu de données
glimpse(pop2015_preparee)
# Préparation des fonds carto
fonds_carto_normands <- filtrer_cog_geo(reg = "28")
#jointure du fond carto EPCI aux données EPCI de Normandie
pop2015_epci_normands_geo <- fonds_carto_normands$epci %>%
left_join(pop2015_preparee, by = c("EPCI" = "CodeZone")) %>%
# calcul des indicateurs a représenter
mutate(poids_pop_a_part = pop2015_a_part / pop2015_totale * 100,
densite_pop = as.numeric(pop2015 / AREA * 1000000))
```
On reprend notre carte ggplot normande en ronds proportionnels :
```{r ggiraph with Marianne}
# On vérifie que la police Marianne est correctement installée.
verif_marianne_ok <- gouvdown::check_fonts_in_r(fonts = "Marianne")
if(!verif_marianne_ok) {
systemfonts::register_font(name = "Marianne light",
system.file("resources/fonts/marianne/truetype/Marianne-Light.ttf",
package = "gouvdown.fonts"))
systemfonts::register_font(name = "Marianne",
system.file("resources/fonts/marianne/truetype/Marianne-Regular.ttf",
package = "gouvdown.fonts"))
}
carte_ronds_prop_dyn <- ggplot(data = pop2015_epci_normands_geo) +
geom_sf_interactive(aes(tooltip = Zone)) +
geom_sf_interactive(data = st_point_on_surface(pop2015_epci_normands_geo),
mapping = aes(size = pop2015_totale, color = poids_pop_a_part,
tooltip = paste0(Zone, "\n", format_fr_nb(pop2015_totale, dec = 0, big_mark = " "), " hab.\ndont ",
format_fr_nb(poids_pop_a_part, dec = 1, big_mark = " "), " % comptés à part"))) +
labs(
title = "Population par EPCI en Normandie",
subtitle = "En 2015", x = "", y = "",
size = "Nombre d'habitants",
color = "Poids population\ncomptée à part (%)",
caption = "Source : INSEE - RP"
) +
theme_gouv_map(plot_title_size = 20, subtitle_size = 12) +
scale_color_gouv_continuous(palette = "pal_gouv_i", reverse = TRUE) +
scale_size_continuous(labels = function(x) format(x, big.mark = " ", scientific = FALSE)) +
annotation_north_arrow(location = "bl", height = unit(0.7, "cm"), width = unit(0.7, "cm"))
girafe(ggobj = carte_ronds_prop_dyn)
```
## Les cartes {mapfactory}
{mapfactory} s'appuie sur {ggiraph} pour rendre ses cartes dynamiques.
Les arguments de la fonction `creer_carte()` en rapport avec l'interactivité sont
`interactive`
TRUE si on veut une carte html interactive.
`popover`
Chaîné de texte désignant le contenu de l'info-bulles. Par défaut, L'étiquette qui s'affiche au survol contient "nom du territoire : valeur de l'indicateur et suffixe", obtenu a partir de ".data$nom_ter : .data$valeur".
`indicateur_popover`
Un nom d'indicateur présent dans data (sans quote) a mobiliser pour le popover. Utiliser `.data$valeur_popover` au niveau du parametre popover pour afficher les valeurs de cet indicateur, par exemple `.data$nom_ter : .data$valeur_popover unites`.
```{r}
creer_carte(data = cogifier(pop2015), code_region = "52", indicateur = pop2015, espace = " ",
interactive = TRUE, type_viz = "proportionnel", maillage = "Départements")
```
## Exporter une sortie html
La fonction `saveWidget()` permet d'exporter une sortie d'un `HTML Widget` en fichier HTML.
```{r, eval=FALSE}
saveWidget(widget = girafe(ggobj = carte_ronds_prop_dyn), file = "part_pop_a_part_epci_normandie.html")
```
## Exercice 5 : cartes DVF pour le web
```{r mod7_exo5, child=charge_exo("m7", "exo5.rmd"), echo=FALSE}
```