|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361 |
- ---
- title: "Interactivité"
- author: "Maxime Wack"
- date: "20/11/2019"
- output:
- xaringan::moon_reader:
- css: ['default','css/my_style.css']
- lib_dir: libs
- seal: false
- nature:
- ratio: '4:3'
- countIncrementalSlides: false
- self-contained: true
- beforeInit: "addons/macros.js"
- ---
-
- ```{r, include = FALSE}
- library(gapminder)
- library(tidyverse)
- library(DT)
- library(knitr)
-
- opts_chunk$set(message = F)
-
- options(DT.options = list(paging = F,
- info = F,
- searching = F))
-
- datatable <- partial(datatable, rownames = F)
- ```
-
- class: center, middle, title
-
- # UE Visualisation
-
- ### 2019-2020
-
- ## Dr. Maxime Wack
-
- ### AHU Informatique médicale
- #### Hôpital Européen Georges Pompidou, </br> Université de Paris
-
- ---
- class: center, middle
-
- # Objectif
-
- ## Ajouter de l'**interactivité** à une visualisation
-
- ---
-
- # Interactivité
-
- ## Réactivité
-
- L'objet **réagit** à l'utilisateur, mais n'est pas modifié
-
- ## Interactivité
-
- L'utilisateur peut **influer** sur l'objet </br>
- Un objet peut en **modifier** un autre
-
- ---
- class: center
-
- # Outils
-
- ### ggplot2 + ggplotly
-
- ### plotly
-
- ### D3
-
- ### VegaLite
-
- ### Shiny
-
- ---
- class: center, middle
-
- # ggplot2 + ggplotly
-
- ---
-
- ### Installer `plotly`
-
- ```{r install plotly, eval = F}
- install.packages("plotly")
- ```
-
- ```{r libs}
- library(tidyverse)
- library(plotly)
- ```
-
- ---
-
- ```{r ggplotly simple}
- iris %>%
- ggplot() +
- aes(x = Petal.Length, fill = Species) +
- geom_histogram() -> plot
-
- ggplotly(plot)
- ```
-
- ---
-
- ```{r ggplotly pipe}
- (iris %>%
- ggplot() +
- aes(x = Petal.Length, y = Petal.Width, color = Species) +
- geom_point()) %>%
- ggplotly
- ```
-
- ---
-
- ```{r ggplotly complex}
- iris %>%
- ggplot() +
- geom_histogram(data = iris %>% select(-Species), aes(x = Petal.Length)) +
- geom_histogram(aes(x = Petal.Length, fill = Species)) +
- facet_grid(~Species) -> plot
-
- ggplotly(plot)
- ```
-
- ---
- class:center, middle
-
- # Plotly
-
- ---
-
- # Plotly
-
- ### Utilise aussi une **grammaire de graphiques**
-
- ### Bibliothèque **JS**
-
- ### Interface par un **package R**
-
- ### Couche d'**abstraction** pour ggplot2
-
- https://plot.ly/r
-
- ---
-
- # Plotly
-
- ### `ggplot` → `plot_ly()`
-
- ### `geom_*` → `add_*` ou `add_trace`
-
- Les *aes* sont données avec des formules dans les traces
-
- ### `facet_*` → **subplots**
-
- ### `scale_*_*` + `theme` → `layout`
-
- ### `+` → `%>%`
-
- ---
-
- ```{r plotly simple}
- iris %>%
- plot_ly() %>%
- add_markers(x = ~Sepal.Length,
- y = ~Sepal.Width)
- ```
-
- ---
-
- ```{r plotly global aes}
- iris %>%
- plot_ly(x = ~Sepal.Length,
- y = ~Sepal.Width) %>%
- add_trace(color = ~Species,
- size = 4,
- mode = "markers")
- ```
-
- ---
-
- ```{r plotly hover}
- iris %>%
- plot_ly(x = ~Sepal.Length,
- y = ~Sepal.Width,
- color = ~Species) %>%
- add_markers(size = 2,
- hoverinfo = "text",
- text = ~str_c("Espèce : ", Species, "\n",
- "Longueur de sépale :", Sepal.Length, "\n",
- "Largeur de sépale :", Sepal.Width))
- ```
-
- ---
-
- # Plotly
-
- ### Interaction poussée (JS)
-
- ### Animations (frame)
-
- *Aesthetic* d'animation, variable définissant l'état à chaque image clé
-
- ---
- class:center, middle
-
- ```{r plotly anim, warning = F, echo = F}
- gapminder %>%
- plot_ly(x = ~gdpPercap,
- y = ~lifeExp,
- size = ~pop,
- frame = ~year,
- color = ~continent,
- text = ~country,
- hoverinfo = "text") %>%
- add_markers() %>%
- layout(xaxis = list(type = "log")) %>%
- animation_opts(1000)
- ```
-
- ---
-
- # D3
-
- .pull-left[
- ### **D**ata **D**riven **D**ocuments
- ### Créé par **Mike Bostock**
- *Data journalist* au NYT
- ]
-
- .pull-right[
- ![:scale 50%](04_img/bostock.jpg)
- ]
-
- ### Moteur *bas niveau* pour manipuler des éléments du DOM et du SVG à partir de données.
-
- ### Notion de grammaire liant données et propriétés CSS, dont **animations** et **transitions**
-
- .center[https://d3js.org]
-
- ---
- class: center
-
- # Outils dérivés de D3.js
-
- ## Plot.ly
-
- ## Vega(lite)
-
- ## C3.js
-
- ## R2D3 https://rstudio.github.io/r2d3/
-
- ---
-
- # Réactivité
-
- ## Tous les outils précédents sont **réactifs**
-
- ### → affichage d'un overlay
-
- ### → changement de position/échelle
-
- ### → afficher / masquer / réordonner
-
- (modulo interactions en *JS* à bricoler soi-même)
-
-
- ---
-
- # Interactivité
-
- ## Manipulation des données
-
- ## Interactions avec la visualisation
-
- ## Interactions entre éléments de visualisation
-
- ---
-
- # Shiny
-
- ### Architecture client/serveur
-
- ### Client = interface web
-
- ### Serveur = runtime R
-
- https://shiny.rstudio.com/
-
- ---
-
- # Shiny
-
- ## Programmation **événementielle** → programmation **réactive**
-
- ## L'interface est mise à jour *quand nécessaire*
-
- ---
-
-
- # Interface web
-
- ### Créée dans R
-
- ### Génère HTML + CSS + JS
-
- ### Définit des **input** et **output**
-
- ---
-
- # UI
-
- ```{r shiny ui, eval = F}
- ui <- fluidPage(titlePanel = "Titre",
- sidebarLayout(
- sidebarPanel(
- sliderInput(inputId = "bins",
- label = "Bins",
- min = 1,
- max = 50,
- value = 30,
- animate = animationOptions(interval = 100))),
- mainPanel(plotOutput(outputId = "figure"))))
- ```
-
- ---
-
- # Serveur
-
- ### Créé et exécuté dans R
-
- ### Génère les éléments d'**output** en fonction des **input**
-
- ### Les **outputs** peuvent *générer* de l'input (htmlwidgets : DT, plotly, etc.)
-
- ### Le serveur peut créer des **input** dynamiques
-
- ---
-
- # Server
-
- ```{r shiny server, eval = F}
- server <- function(input, output, session)
- {
- set.seed(1234)
- normale <- tibble(val = rnorm(1000))
-
- output$figure <- renderPlot(
- {
- normale %>%
- ggplot() +
- aes(x = val) +
- geom_histogram(bins = input$bins)
- })
- }
- ```
|