ajout animation

This commit is contained in:
François Pelletier 2016-10-14 20:40:56 -04:00
parent 36d7aad222
commit 7a4815da32
3 changed files with 98 additions and 22 deletions

4
.gitignore vendored Normal file
View file

@ -0,0 +1,4 @@
.Rproj.user
.Rhistory
.RData
.Ruserdata

View file

@ -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
View 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