Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

364 linhas
5.8KB

  1. ---
  2. title: "Interactivité"
  3. author: "Maxime Wack"
  4. date: "17/11/2020"
  5. output:
  6. xaringan::moon_reader:
  7. css: ['default','css/my_style.css']
  8. lib_dir: libs
  9. seal: false
  10. nature:
  11. ratio: '4:3'
  12. countIncrementalSlides: false
  13. self-contained: true
  14. beforeInit: "addons/macros.js"
  15. ---
  16. ```{r, include = FALSE}
  17. library(gapminder)
  18. library(tidyverse)
  19. library(DT)
  20. library(knitr)
  21. opts_chunk$set(message = F)
  22. options(DT.options = list(paging = F,
  23. info = F,
  24. searching = F))
  25. datatable <- partial(datatable, rownames = F)
  26. ```
  27. class: center, middle, title
  28. # UE Visualisation
  29. ### 2020-2021
  30. ## Dr. Maxime Wack
  31. ### AHU Informatique médicale
  32. #### Hôpital Européen Georges Pompidou, </br> Université de Paris
  33. ---
  34. class: center, middle
  35. # Objectif
  36. ## Ajouter de l'**interactivité** à une visualisation
  37. ---
  38. # Interactivité
  39. ## Réactivité
  40. L'objet **réagit** à l'utilisateur, mais n'est pas modifié
  41. ## Interactivité
  42. L'utilisateur peut **influer** sur l'objet </br>
  43. Un objet peut en **modifier** un autre
  44. ---
  45. class: center
  46. # Outils
  47. ### ggplot2 + ggplotly
  48. ### plotly
  49. ### D3
  50. ### VegaLite
  51. ### Shiny
  52. ---
  53. class: center, middle
  54. # ggplot2 + ggplotly
  55. ---
  56. ### Installer `plotly`
  57. ```{r install plotly, eval = F}
  58. install.packages("plotly")
  59. ```
  60. ```{r libs}
  61. library(tidyverse)
  62. library(plotly)
  63. ```
  64. ---
  65. ```{r ggplotly simple}
  66. iris %>%
  67. ggplot() +
  68. aes(x = Petal.Length, fill = Species) +
  69. geom_histogram() -> plot
  70. ggplotly(plot)
  71. ```
  72. ---
  73. ```{r ggplotly pipe}
  74. (iris %>%
  75. ggplot() +
  76. aes(x = Petal.Length, y = Petal.Width, color = Species) +
  77. geom_point()) %>%
  78. ggplotly
  79. ```
  80. ---
  81. ```{r ggplotly complex}
  82. iris %>%
  83. ggplot() +
  84. geom_histogram(data = iris %>% select(-Species), aes(x = Petal.Length)) +
  85. geom_histogram(aes(x = Petal.Length, fill = Species)) +
  86. facet_grid(~Species) -> plot
  87. ggplotly(plot)
  88. ```
  89. ---
  90. class:center, middle
  91. # Plotly
  92. ---
  93. # Plotly
  94. ### Utilise aussi une **grammaire de graphiques**
  95. ### Bibliothèque **JS**
  96. ### Interface par un **package R**
  97. ### Couche d'**abstraction** pour ggplot2
  98. https://plot.ly/r
  99. ---
  100. # Plotly
  101. ### `ggplot` → `plot_ly()`
  102. ### `geom_*` → `add_*` ou `add_trace`
  103. Les *aes* sont données avec des formules dans les traces
  104. ### `facet_*` → **subplots**
  105. ### `scale_*_*` + `theme` → `layout`
  106. ### `+` → `%>%`
  107. ---
  108. ```{r plotly simple}
  109. iris %>%
  110. plot_ly() %>%
  111. add_markers(x = ~Sepal.Length,
  112. y = ~Sepal.Width)
  113. ```
  114. ---
  115. ```{r plotly global aes}
  116. iris %>%
  117. plot_ly(x = ~Sepal.Length,
  118. y = ~Sepal.Width) %>%
  119. add_trace(color = ~Species,
  120. size = 4,
  121. mode = "markers")
  122. ```
  123. ---
  124. ```{r plotly hover}
  125. iris %>%
  126. plot_ly(x = ~Sepal.Length,
  127. y = ~Sepal.Width,
  128. color = ~Species) %>%
  129. add_markers(size = 2,
  130. hoverinfo = "text",
  131. text = ~str_c("Espèce : ", Species, "\n",
  132. "Longueur de sépale :", Sepal.Length, "\n",
  133. "Largeur de sépale :", Sepal.Width))
  134. ```
  135. ---
  136. # Plotly
  137. ### Interaction poussée (JS)
  138. ### Animations (frame)
  139. *Aesthetic* d'animation, variable définissant l'état à chaque image clé
  140. ---
  141. class:center, middle
  142. ```{r plotly anim, warning = F, echo = F}
  143. gapminder %>%
  144. plot_ly(x = ~gdpPercap,
  145. y = ~lifeExp,
  146. size = ~pop,
  147. frame = ~year,
  148. color = ~continent,
  149. text = ~country,
  150. hoverinfo = "text") %>%
  151. add_markers() %>%
  152. layout(xaxis = list(type = "log")) %>%
  153. animation_opts(1000)
  154. ```
  155. ---
  156. # D3
  157. .pull-left[
  158. ### **D**ata **D**riven **D**ocuments
  159. ### Créé par **Mike Bostock**
  160. *Data journalist* au NYT
  161. ]
  162. .pull-right[
  163. ![:scale 50%](04-img/bostock.jpg)
  164. ]
  165. ### Moteur *bas niveau* pour manipuler des éléments du DOM et du SVG à partir de données.
  166. ### Notion de grammaire liant données et propriétés CSS, dont **animations** et **transitions**
  167. .center[https://d3js.org]
  168. ---
  169. class: center
  170. # Outils dérivés de D3.js
  171. ## Plot.ly
  172. ## Vega(lite)
  173. ## C3.js
  174. ## R2D3 https://rstudio.github.io/r2d3/
  175. ---
  176. # Réactivité
  177. ## Tous les outils précédents sont **réactifs**
  178. ### → affichage d'un overlay
  179. ### → changement de position/échelle
  180. ### → afficher / masquer / réordonner
  181. (modulo interactions en *JS* à bricoler soi-même)
  182. ---
  183. # Interactivité
  184. ## Manipulation des données
  185. ## Interactions avec la visualisation
  186. ## Interactions entre éléments de visualisation
  187. ---
  188. # Shiny
  189. ### Architecture client/serveur
  190. ### Client = interface web
  191. ### Serveur = runtime R
  192. https://shiny.rstudio.com/
  193. https://mastering-shiny.org/
  194. ---
  195. # Shiny
  196. ## Programmation **événementielle** → programmation **réactive**
  197. ## L'interface est mise à jour *quand nécessaire*
  198. ---
  199. # Interface web
  200. ### Créée dans R
  201. ### Génère HTML + CSS + JS
  202. ### Définit des **input** et **output**
  203. ---
  204. # UI
  205. ```{r shiny ui, eval = F}
  206. ui <- fluidPage(titlePanel = "Titre",
  207. sidebarLayout(
  208. sidebarPanel(
  209. sliderInput(inputId = "bins",
  210. label = "Bins",
  211. min = 1,
  212. max = 50,
  213. value = 30,
  214. animate = animationOptions(interval = 100))),
  215. mainPanel(plotOutput(outputId = "figure"))))
  216. ```
  217. ---
  218. # Serveur
  219. ### Créé et exécuté dans R
  220. ### Génère les éléments d'**output** en fonction des **input**
  221. ### Les **outputs** peuvent *générer* de l'input (htmlwidgets : DT, plotly, etc.)
  222. ### Le serveur peut créer des **input** dynamiques
  223. ---
  224. # Server
  225. ```{r shiny server, eval = F}
  226. server <- function(input, output, session)
  227. {
  228. set.seed(1234)
  229. normale <- tibble(val = rnorm(1000))
  230. output$figure <- renderPlot(
  231. {
  232. normale %>%
  233. ggplot() +
  234. aes(x = val) +
  235. geom_histogram(bins = input$bins)
  236. })
  237. }
  238. ```