ajout animation
This commit is contained in:
parent
36d7aad222
commit
7a4815da32
3 changed files with 98 additions and 22 deletions
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
|||
.Rproj.user
|
||||
.Rhistory
|
||||
.RData
|
||||
.Ruserdata
|
103
leaflet.Rmd
103
leaflet.Rmd
|
@ -48,13 +48,17 @@ library("leaflet")
|
|||
## Autres bibliothèques
|
||||
|
||||
Ces autres bibliothèques nous seront utiles dans cet atelier
|
||||
```{r, echo=TRUE}
|
||||
```{r pkgs, cache = FALSE, echo=TRUE}
|
||||
library("rgdal")
|
||||
library("dplyr")
|
||||
library("webshot")
|
||||
library("shiny")
|
||||
library("htmltools")
|
||||
library("reshape2")
|
||||
require(XML)
|
||||
require(stringr)
|
||||
library(gganimate)
|
||||
library(animation)
|
||||
```
|
||||
|
||||
## La composition d'une carte
|
||||
|
@ -66,20 +70,20 @@ Une carte peut être composée de plusieurs éléments:
|
|||
- On peut y ajouter divers autres éléments informatifs ou décoratifs
|
||||
|
||||
## Acquisition des données
|
||||
Les données géographiques vectorielles (polygones, lignes, points) sont souvent représntées sous forme de fichiers KML, geoJSON ou ESRI Shapefiles. Les tuiles de données ou raster sont souvent au format geoTIFF.
|
||||
Les données géographiques vectorielles (polygones, lignes, points) sont souvent représentées sous forme de fichiers KML, geoJSON ou ESRI Shapefiles. Les tuiles de données ou raster sont souvent au format geoTIFF.
|
||||
|
||||
L'objet data de la vignette peut accueillir différentes structures de données, mais il faut au préalablement les créer à partir des données sources
|
||||
|
||||
Nous utiliserons la bibliothèque `rgdal` our lire les données et créer ces structures
|
||||
|
||||
## Données utilisées dans cet atelier
|
||||
Dans cet atelier, nous cherchons à représenter la couverture WiFi du réseau [ZAP Québec](http://www.zapquebec.org/) à l'aide de la localisation des différents points d'accès contenus dans le fichier "WIFI.KML" téléchargé sur[le portail Données Québec](https://www.donneesquebec.ca/recherche/fr/dataset/vque_29). Ce fichier est partagé sous la licence [Creative Commons - Attribution 4.0](https://www.donneesquebec.ca/fr/licence/#cc-by).
|
||||
Dans cet atelier, nous cherchons à représenter la couverture Wifi du réseau [ZAP Québec](http://www.zapquebec.org/) à l'aide de la localisation des différents points d'accès contenus dans le fichier "WIFI.KML" téléchargé sur[le portail Données Québec](https://www.donneesquebec.ca/recherche/fr/dataset/vque_29). Ce fichier est partagé sous la licence [Creative Commons - Attribution 4.0](https://www.donneesquebec.ca/fr/licence/#cc-by).
|
||||
|
||||
## KML
|
||||
Le format de fichiers KML est un standard ouvert [développé par Google](https://developers.google.com/kml/documentation/) pour l'application Google Earth. C'est un fichier XML avec des caractéristiques particulières.
|
||||
|
||||
## Acquisition des données (1/2)
|
||||
Pour lire le fichier de donnéees, on utilise la fonction `readOGR()` de `rgdal`.
|
||||
Pour lire le fichier de données, on utilise la fonction `readOGR()` de `rgdal`.
|
||||
```{r, echo=TRUE}
|
||||
WIFI_DATA <- readOGR("./DATA/WIFI.KML", "WIFI")
|
||||
```
|
||||
|
@ -89,7 +93,7 @@ On obtient un objet de la classe `SpatialPointsDataFrame`.
|
|||
class(WIFI_DATA)
|
||||
```
|
||||
|
||||
Cette classe est un type de données complexer qui inclut entre autres un data.frame `data` contenant les données extraites du fichier KML. La structure complete de notre exemple se rpésente comme suit.
|
||||
Cette classe est un type de données complexer qui inclut entre autres un data.frame `data` contenant les données extraites du fichier KML. La structure complète de notre exemple se présente comme suit.
|
||||
|
||||
```{r}
|
||||
str(WIFI_DATA)
|
||||
|
@ -98,12 +102,12 @@ str(WIFI_DATA)
|
|||
## Attributs
|
||||
Chaque point présente 6 attributs:
|
||||
|
||||
- ARROND : Nom de l'arrondissement où se situe le réseau WiFi.
|
||||
- NO_CIV : Numéro civique du réseau WiFi.
|
||||
- NOM_BATI : Nom de l'édifice où se situe le réseau WiFi.
|
||||
- RUE : Nom de la rue où se situe le réseau WiFi.
|
||||
- LONGITUDE : Longitude du réseau WiFi.
|
||||
- LATITUDE : Latitude du réseau WiFi.
|
||||
- ARROND : Nom de l'arrondissement où se situe le réseau Wifi.
|
||||
- NO_CIV : Numéro d'immeuble du réseau Wifi.
|
||||
- NOM_BATI : Nom de l'édifice où se situe le réseau Wifi.
|
||||
- RUE : Nom de la rue où se situe le réseau Wifi.
|
||||
- LONGITUDE : Longitude du réseau Wifi.
|
||||
- LATITUDE : Latitude du réseau Wifi.
|
||||
|
||||
## La vignette interactive Leaflet
|
||||
La création d'une carte débute avec la vignette interactive (widget) `leaflet()`:
|
||||
|
@ -111,11 +115,11 @@ La création d'une carte débute avec la vignette interactive (widget) `leaflet(
|
|||
leaflet()
|
||||
```
|
||||
|
||||
Cette vignette peut être modifiées à l'aide de différentes propriétés et différents opérateurs que nous explorerons dans cet atelier.
|
||||
Cette vignette peut être modifiée à l'aide de différentes propriétés et différents opérateurs que nous explorerons dans cet atelier.
|
||||
|
||||
## Ajout des données à la carte
|
||||
|
||||
On associe à la propriété data les données que nous avons importé. On utilise la fonction `addTiles` pour ajouter des tuiles de fond et `addMarker` pour ajouter des marqueurs basés sur les coordonnées géographiques. Enfin, on utilise l'argument `popup` pour inclure une description qui sera affichée en cliquant sur un marqueur. Les données que nous utilisons incluent déjà une description en HTML. L'argument `group` sert a`attribuer iun idnetifiant pour chaque élément composant la carte. Il n'est pas affiché sur la carte sauf si on le demande explicitement, dans un menu par exemple.
|
||||
On associe à la propriété data les données que nous avons importées. On utilise la fonction `addTiles` pour ajouter des tuiles de fond et `addMarker` pour ajouter des marqueurs basés sur les coordonnées géographiques. Enfin, on utilise l'argument `popup` pour inclure une description qui sera affichée en cliquant sur un marqueur. Les données que nous utilisons incluent déjà une description en HTML. L'argument `group` sert a attribuer un identifiant pour chaque élément composant la carte. Il n'est pas affiché sur la carte sauf si on le demande explicitement, dans un menu par exemple.
|
||||
|
||||
```{r, echo=TRUE}
|
||||
l1 <- leaflet(data=WIFI_DATA) %>%
|
||||
|
@ -183,7 +187,7 @@ l1 %>%
|
|||
|
||||
## Introduction
|
||||
|
||||
[Plotly](https://plot.ly/) est une bliblothèque de graphiques interactifs en JavaScript. Tout comme Leaflet, on peut l'utiliser via des interfaces dans plusieurs langages de programmation, dont R. L'interface de programmation est documentée [sur ce site](https://plot.ly/r/).
|
||||
[Plotly](https://plot.ly/) est une bibliothèque de graphiques interactifs en JavaScript. Tout comme Leaflet, on peut l'utiliser via des interfaces dans plusieurs langages de programmation, dont R. L'interface de programmation est documentée [sur ce site](https://plot.ly/r/).
|
||||
|
||||
Plotly permet de créer plusieurs types de graphiques (statistiques, scientifiques, cartes, 3d) et permet aussi de convertir des graphiques créés à partir de `ggplot2`.
|
||||
|
||||
|
@ -350,13 +354,13 @@ Un graphique comprend plusieurs types d'éléments:
|
|||
- Position adjustments: Permettent de gérer les superpositions ou d'ajouter du flou dans les données
|
||||
- Annotation: Ajout d'annotations à un graphique
|
||||
- Fortify: Utiliser des données qui ne sont pas sous la forme de tables
|
||||
- Themes: Élements qui définissent un thème d'affichage, indépendamment du type de graphique
|
||||
- Aesthetics: Permet d'associer les données à des caractéristiques du graphique: les axes, les couleurs, les épaisseurs de traits, ...
|
||||
- Themes: Éléments qui définissent un thème d'affichage, indépendamment du type de graphique
|
||||
- Aesthetics: Permets d'associer les données à des caractéristiques du graphique: les axes, les couleurs, les épaisseurs de traits ...
|
||||
- Other: Autres outils
|
||||
|
||||
## Exemple
|
||||
|
||||
Pour cet exemple, on utilise le jeu de données [Effectif de la fonction publique fédérale par ministère et région](http://open.canada.ca/data/en/dataset/933f8f6e-daee-4368-a7dc-4eadc8b5ecfa) provanant de Secrétariat du Conseil du Trésor du Canada. Cette source contient de l'information visée par la [Licence du gouvernement ouvert – Canada](http://ouvert.canada.ca/fr/licence-du-gouvernement-ouvert-canada).
|
||||
Pour cet exemple, on utilise le jeu de données [Effectif de la fonction publique fédérale par ministère et région](http://open.canada.ca/data/en/dataset/933f8f6e-daee-4368-a7dc-4eadc8b5ecfa) provenant de Secrétariat du Conseil du Trésor du Canada. Cette source contient de l'information visée par la [Licence du gouvernement ouvert – Canada](http://ouvert.canada.ca/fr/licence-du-gouvernement-ouvert-canada).
|
||||
|
||||
```{r, echo=TRUE}
|
||||
ssa_pop2 <- read.csv("DATA/ssa-pop2-fra.csv", sep=",", stringsAsFactors = FALSE) %>%
|
||||
|
@ -369,7 +373,7 @@ ssa_pop2 <- read.csv("DATA/ssa-pop2-fra.csv", sep=",", stringsAsFactors = FALSE)
|
|||
```
|
||||
|
||||
## Graphique à lignes brisées
|
||||
Nous définissons la structure de bases pour créer notre graphiques. Nous identifions les données qui seront utilisées ainsi que les "esthétiques" du graphique.
|
||||
Nous définissons la structure de bases pour créer notre graphique. Nous identifions les données qui seront utilisées ainsi que les "esthétiques" du graphique.
|
||||
```{r, echo=TRUE}
|
||||
g1 <- ggplot(ssa_pop2, aes(x=new_date,y=total_employes))
|
||||
```
|
||||
|
@ -410,16 +414,71 @@ On convertis l'axe vertical en échelle logarithmique:
|
|||
g3+geom_boxplot(aes(colour=Province))+scale_y_log10()
|
||||
```
|
||||
|
||||
Ce type de graphique n'est pas géré par plotly, nous ne pouvons donmc pas le convertir en version interactive.
|
||||
Ce type de graphique n'est pas géré par plotly, nous ne pouvons donc pas le convertir en version interactive.
|
||||
|
||||
# ggplot2 et gganimate
|
||||
|
||||
L'utilisation combinée des bibliothèques ggplot2 et gganimate nous permettra de créer une animation.
|
||||
Nous reproduisons ici la [pyramide des âges animée](https://www.donneesquebec.ca/recherche/fr/dataset/pyramide-des-ages-animee) de l'Institut de la statistique du Québec. Les données téléchargées se trouvent dans le fichier [`tbl_bord_0001_35.xml`](http://www.bdso.gouv.qc.ca/docs-ken/flex/xml/tbl_bord_0001_35.xml).
|
||||
|
||||
```{r, echo=TRUE}
|
||||
|
||||
On installe `gganimate` avec la commande suivante, qui nécessite la bibliothèque `devtools` ainsi que le nécessaire pour compiler (le paquet `r-base-dev` sur Debian, R-Tools sur Windows):
|
||||
```{r, eval=FALSE, echo=TRUE}
|
||||
devtools::install_github("dgrtwo/gganimate")
|
||||
```
|
||||
|
||||
On charge gganimate
|
||||
```{r, echo=TRUE}
|
||||
library(gganimate)
|
||||
```
|
||||
|
||||
## Données
|
||||
|
||||
Nous reproduisons ici la [pyramide des âges animée](https://www.donneesquebec.ca/recherche/fr/dataset/pyramide-des-ages-animee) de l'Institut de la statistique du Québec. Les données téléchargées se trouvent dans le fichier [`tbl_bord_0001_35.xml`](http://www.bdso.gouv.qc.ca/docs-ken/flex/xml/tbl_bord_0001_35.xml).
|
||||
|
||||
## Transformation des données
|
||||
|
||||
On extrait les données d'un fichier XML, puis on prépare les données sur le bon format pour faire une pyramide des âges.
|
||||
```{r, echo=TRUE}
|
||||
df_tbl_bord_0001_35 <- xmlToDataFrame("DATA/tbl_bord_0001_35.xml")
|
||||
df_tbl_bord_0001_35_2 <- df_tbl_bord_0001_35 %>%
|
||||
mutate(AGE = DE_CODFC_REFRN %>% str_extract("([0-9]+)")) %>%
|
||||
select(-c(DE_CODFC_REFRN,DE_DIMNS_UNIT_MESR)) %>%
|
||||
melt(id.vars=c("DE_TERTR_REFRN","DE_TEMPS_REFRN","AGE"),
|
||||
measure.vars=c("HOMME","FEMME"),
|
||||
variable.name="GENRE",
|
||||
value.name = "NOMBRE") %>%
|
||||
mutate(NOMBRE = NOMBRE %>% as.integer() %>% ifelse(is.na(.),0,.),
|
||||
AGE = AGE %>% as.integer(),
|
||||
DE_TEMPS_REFRN = DE_TEMPS_REFRN %>% as.integer())
|
||||
```
|
||||
|
||||
On construit la pyramide des âges. La variable `frame` sera utilisée pour créer chacune des images de l'animation.
|
||||
```{r, echo=TRUE}
|
||||
pyramide_ages <- df_tbl_bord_0001_35_2 %>%
|
||||
ggplot(aes(frame = DE_TEMPS_REFRN)) +
|
||||
geom_bar(data=subset(df_tbl_bord_0001_35_2,GENRE=="FEMME"),
|
||||
aes(x=AGE,y=NOMBRE,fill=GENRE,group=DE_TEMPS_REFRN),
|
||||
stat = "identity",
|
||||
position = "identity") +
|
||||
geom_bar(data=subset(df_tbl_bord_0001_35_2,GENRE=="HOMME"),
|
||||
aes(x=AGE,y=-NOMBRE,fill=GENRE,group=DE_TEMPS_REFRN),
|
||||
stat = "identity",
|
||||
position = "identity") +
|
||||
scale_y_continuous(breaks=seq(-40000,40000,40000),
|
||||
labels=abs(seq(-40000,40000,40000))) +
|
||||
coord_flip()
|
||||
```
|
||||
|
||||
On l'anime.
|
||||
|
||||
```{r interval, echo = FALSE, cache = FALSE}
|
||||
ani.options(autobrowse = FALSE, interval = .2)
|
||||
```
|
||||
|
||||
```{r, echo = TRUE}
|
||||
gg_animate(pyramide_ages,"pyramide_ages.gif")
|
||||
```
|
||||
|
||||
![](pyramide_ages.gif)
|
||||
|
||||
|
||||
|
||||
|
|
13
r-dataviz-formation.Rproj
Normal file
13
r-dataviz-formation.Rproj
Normal file
|
@ -0,0 +1,13 @@
|
|||
Version: 1.0
|
||||
|
||||
RestoreWorkspace: Default
|
||||
SaveWorkspace: Default
|
||||
AlwaysSaveHistory: Default
|
||||
|
||||
EnableCodeIndexing: Yes
|
||||
UseSpacesForTab: Yes
|
||||
NumSpacesForTab: 2
|
||||
Encoding: UTF-8
|
||||
|
||||
RnwWeave: Sweave
|
||||
LaTeX: pdfLaTeX
|
Loading…
Reference in a new issue