class: center, middle, inverse, title-slide .title[ # Atelier 3: Introduction à la visualisation des données avec
ggplot2
] .subtitle[ ## Série d’ateliers R du CSBQ ] .author[ ### Centre de la Science de la Biodiversité du Québec ] --- class: inverse, center, middle # À propos de cet atelier [![badge](https://img.shields.io/static/v1?style=for-the-badge&label=repo&message=dev&color=6f42c1&logo=github)](https://github.com/QCBSRworkshops/workshop03) [![badge](https://img.shields.io/static/v1?style=for-the-badge&label=Diapos&message=03&color=red&logo=html5)](https://r.qcbs.ca/workshop03/workshop03-fr/workshop03-fr.html) [![badge](https://img.shields.io/static/v1?style=for-the-badge&label=Diapos&message=03&color=red&logo=adobe-acrobat-reader)](https://r.qcbs.ca/workshop03/workshop03-fr/workshop03-fr.pdf) [![badge](https://img.shields.io/static/v1?style=for-the-badge&label=script&message=03&color=2a50b8&logo=r)](https://r.qcbs.ca//workshop03/book-fr/workshop03-script-fr.R) --- <p style="font-size:75%"> .center[ **Contributeurs et contributrices au développement de cet atelier** en modifiant et en améliorant son contenu dans le cadre du <br>_**Le**arning **a**nd **D**evelopment **A**ward_ du **CSBQ**: ] .pull-left[ .right[ **2022** - **2021** - **2020** [Pedro Henrique P. Braga]() [Katherine Hébert]() [Linley Sherin]() [Jake Lawlor]() [Marie-Hélène Brice]() [Kevin Cazelles]() ] ] .pull-right[ .left[ **2019** - **2018** - **2017** [Willian Vieira]() [Rémi Maglione]() [Alexis Carteron]() [Pedro Henrique P. Braga]() [Katherine Hébert]() <br> **2016** - **2015** - **2014** [Xavier Giroux-Bougard]() [Maxwell Farrell]() [Amanda Winegardner]() [Étienne Low-Decarie]() [Monica Granados]() ] ] </p> --- # Matériel requis .small[Pour suivre cet atelier, vous devez avoir téléchargé et installé les dernières versions de [RStudio](https://rstudio.com/products/rstudio/download/#download) et de [R](https://cran.rstudio.com/).] .pull-left3[ .small[Vous devez également utiliser les paquets suivants :] * [gridExtra](https://cran.r-project.org/package=gridExtra) * [ggplot2](https://cran.r-project.org/package=ggplot2) * [ggsignif](https://cran.r-project.org/package=ggsignif) * [ggdendro](https://cran.r-project.org/package=ggdendro) * [maps](https://cran.r-project.org/package=maps) * [mapproj](https://cran.r-project.org/package=mapproj) * [RColorBrewer](https://cran.r-project.org/package=RColorBrewer) * [GGally](https://cran.r-project.org/package=GGally) * [patchwork](https://cran.r-project.org/package=patchwork) * [palmerpenguins](https://cran.r-project.org/package=palmerpenguins) * [plotly](https://cran.r-project.org/package=plotly) * [colorBlindness](https://cran.r-project.org/package=colorBlindness) ] .pull-right3[ .small[Pour les installer depuis CRAN, exécutez :] ```r install.packages( c('grid', 'gridExtra', 'ggplot2', 'ggsignif', 'ggdendro', 'maps', 'mapproj', 'RColorBrewer', 'GGally', 'patchwork', 'plotly','palmerpenguins', 'colorBlindness') ) ``` ] .small[Tout le matériel de l'atelier se trouve sur le site [r.qcbs.ca/workshops/r-workshop-03/](https://r.qcbs.ca/workshops/r-workshop-03/).] --- # Objectifs d'apprentissage **1.** Apprendre les bases de la visualisation de données en utilisant `R` ; **2.** Apprendre et identifier les dynamiques de base pour construire des figures en suivant l'approche de la *grammaire des graphiques* en couches ; **3.** Utiliser `R` et le paquet `ggplot2` pour créer et modifier des figures ; **4.** Réfléchir de manière critique et discuter sur la représentation et sur la visualisation des données. -- .pull-left[ **Recommandations** 1. Créez et gérez votre propre nouveau script ; 2. Abstenez-vous de toujours vous référer au code préconstruit ; *c'est-à-dire, sortir des sentiers battus !*. 3. Évitez de copier-coller ou d'exécuter le code directement à partir du script ; 4. Interagissez avec les présentateurs ! ] -- .pull-left[ **Disclaimer** Bien que nous discuterons des principes de la visualisation de données tout au long de cet atelier, notre objectif principal est de vous montrer comment produire des figures avec `ggplot2`. Nous sommes limités par le temps, mais nous vous recommandons de nous interrompre pour discuter de ces principes ainsi que pour consulter d'autres ressources. ] --- class: inverse, center, middle # Introduction --- # Outline ###### 1. Petite discussion sur la visualisation des données ; ###### 2. Mécanique de `ggplot2` ; ###### 3. Cartographie esthétique ; ###### 4. Ajustement fin ; ###### 5. Enregistrement des tracés ; ###### 6. Ressources et conseils supplémentaires. --- # Qu'est-ce que la visualisation de données ? **_La visualisation de données_ est la présentation de données dans un format pictural ou graphique**, et un _outil de visualisation de données_ est le logiciel qui génère cette présentation. <br> **_Une visualisation efficace des données_** fournit aux utilisateurs et utilisatrices des moyens intuitifs pour : - **explorer et analyser les données de manière interactive**, ce qui leur permet de - **identifier efficacement des patrons d'intérêt**, - **inférer des corrélations et des causalités**, et - **soutenir les opérations de prise de décisions** <br> .xsmall[Bikakis, Nikos. "Big data visualization tools." arXiv preprint arXiv:1801.08336 ([2018](http://arxiv.org/abs/1801.08336)).] --- # Un exemple court et historique : **Avez-vous déjà entendu parler de John Snow ?** .pull-left3[ Dans les années 1850, on pensait que le choléra était transmis et propagé par du "mauvais air" provenant de matières organiques en décomposition. L'épidémie soudaine et grave de choléra dans le quartier londonien de Soho était un mystère. Le médecin John Snow a décidé d'interroger les habitants et de **cartographier les décès dus au choléra**. Il a constaté qu'il y avait un lien entre le choléra et l'eau potable contaminée : la plupart des décès étaient dus à des personnes dont l'accès le plus proche à l'eau était la pompe de Broad Street, où l'on a découvert que des bactéries fécales provenaient d'une fosse d'aisance voisine. ] .pull-right3[ ![](https://i.guim.co.uk/img/static/sys-images/Guardian/Pix/pictures/2013/3/14/1363276161917/Dr-John-Snow-009.jpg?width=620&quality=85&auto=format&fit=max&s=f5c377f1983fb41c72ab679101d05986) ![John Snow's cholera map of Soho](https://i.guim.co.uk/img/static/sys-images/Guardian/Pix/pictures/2013/3/14/1363276040034/John-Snows-cholera-map-of-008.jpg?width=700&quality=85&auto=format&fit=max&s=b92a9f9ec6b720307778b9205bda1396) ] --- # Un exemple court et historique : **Avez-vous déjà entendu parler de John Snow ?** .small[Alors que John Snow a dû dessiner sa carte à la main, nous avons l'avantage de disposer de ressources informatiques pour représenter des données rapidement !] .pull-left3[ .panelset[ .panel[.panel-name[Figure] .xsmall[ <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-3-1.png" width="432" style="display: block; margin: auto;" /> .center[.xsmall[Reconstitution de la carte originale de John Snow sur l'épidémie de choléra de 1854.]] ] ] .panel[.panel-name[R Code] .xsmall[ ```r library(tidyverse); library(mdsr) library(sf); library(ggspatial) dsn <- fs::path("data", "SnowGIS_SHP") ggplot(st_read(dsn, layer = "Cholera_Deaths") %>% st_set_crs(27700) %>% st_transform(4326)) + annotation_map_tile(type = "osm", zoomin = 0) + geom_sf(aes(size = Count, alpha = 0.7)) + geom_sf(data = st_read(dsn, layer = "Pumps") %>% st_set_crs(27700) %>% st_transform(4326), size = 3, colour = "red") ``` Source: [Modern Data Science with R](https://mdsr-book.github.io/mdsr2e/ch-spatial.html) ] ] ] ] .pull-right3[ ![](https://i.guim.co.uk/img/static/sys-images/Guardian/Pix/pictures/2013/3/14/1363276161917/Dr-John-Snow-009.jpg?width=620&quality=85&auto=format&fit=max&s=f5c377f1983fb41c72ab679101d05986) ![John Snow's cholera map of Soho](https://i.guim.co.uk/img/static/sys-images/Guardian/Pix/pictures/2013/3/14/1363276040034/John-Snows-cholera-map-of-008.jpg?width=700&quality=85&auto=format&fit=max&s=b92a9f9ec6b720307778b9205bda1396) ] ??? La taille de chaque point noir est proportionnelle au nombre de personnes qui sont mortes du choléra à cet endroit. Les points rouges indiquent l'emplacement des pompes à eau publiques. --- class: middle, center #### Tout le monde a déjà fait une figure comme celle-ci ! <br> .center[ ![:scale 65%](images/piechart3d.png)] <br> **Quels sont les problèmes qu'elle pose, et qu'est-ce qui peut être amélioré ?** <br> _Il est temps de discuter !_ <br> ??? La représentation graphique en 3D n'ajoute aucune information, elle déforme les proportions de chaque catégorie, de sorte que les catégories au premier plan semblent plus importantes que celles du second plan. Les étiquettes de texte ne sont pas assez claires pour être utiles : elles sont petites, empiètent sur le graphique et incluent un pourcentage qui devrait être communiqué par le graphique lui-même. Les diagrammes circulaires ne sont plus recommandés car ils s'appuient sur des angles pour représenter la différence entre les parties, mais l'œil humain n'est pas très doué pour lire/interpréter les angles. Nous sommes bien meilleurs pour lire les différences de surface ! Vous trouverez une bonne démonstration du problème des diagrammes circulaires à l'adresse suivante : https://www.data-to-viz.com/caveat/pie.html. --- # L'efficacité de la visualisation des données dépend de plusieurs facteurs - Que voulez-vous communiquer ? <br> - Qui est votre public ? - Des chercheurs ? Des journalistes ? Le grand public ? Les évaluateurs de subventions ? <br> - Quelle est la meilleure façon de représenter vos données et votre message ? - Est-ce par un _box plot_ ? - Devriez-vous utiliser du bleu ou du rouge ? - Quelle échelle devriez-vous utiliser ? - Devriez-vous ajouter ou supprimer des informations ? <br> --- # Pourquoi utiliser `R` pour représenter des figures ? .pull-left[ .center[Un exemple de flux de travail pour analyser les données _sans_ `R`.] <br> <img src="images/workflow-without-R-flow.svg" width="90%" style="display: block; margin: auto;" /> ] -- .pull-right[ .center[`R` allows you to converge many tasks without using other programs.] <br> <img src="images/workflow-with-R-flow.svg" width="90%" style="display: block; margin: auto;" /> ] --- ###### De nombreux paquets `R` peuvent nous aider à créer des figures [De nombreux paquets et fonctions](https://insileco.github.io/wiki/rgraphpkgs/) peuvent être utilisés pour une visualisation de haute qualité (*e.g.*, [`base R`](https://bookdown.org/rdpeng/exdata/the-base-plotting-system-1.html), [`plotly`](https://plot.ly/r/), [`sjPlot`](http://www.strengejacke.de/sjPlot/), [`mapview`](https://r-spatial.github.io/mapview/), [`igraph`](https://igraph.org/r/)). .pull-left3[ <div class="figure" style="text-align: center"> <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-4-1.png" alt="Using base::plot()" width="40%" /> <p class="caption">Using base::plot()</p> </div> <div class="figure" style="text-align: center"> <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-5-1.png" alt="Using sjPlot::plot_model()" width="40%" /> <p class="caption">Using sjPlot::plot_model()</p> </div> ] .pull-right3[ <br> <div class="figure" style="text-align: center"> <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-6-1.png" alt="Figures generated using ggplot2::ggplot()" width="432" /> <p class="caption">Figures generated using ggplot2::ggplot()</p> </div> ] --- ###### De nombreux paquets `R` peuvent nous aider à créer des figures, mais... .small[ .pull-left[ Nous allons nous concentrer sur [`ggplot2`](https://ggplot2.tidyverse.org/) car : 1. Il permet de créer facilement de très beaux graphiques personnalisables ; 2. Il implémente un système standardisé, en _couches_, pour la construction de graphiques (*c'est-à-dire* la _Grammaire des Graphiques_ ou _Grammar of Graphics_, dont nous parlerons plus tard !) ; 3. De [nombreuses extensions](https://exts.ggplot2.tidyverse.org/gallery/) ont été développées et sont facilement accessibles (*e.g.* `gganimate`). .center[![:scale 25%](images/ggplot2_logo.png)] ] ] .pull-right[ <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-7-1.png" width="432" style="display: block; margin: auto;" /> <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-8-1.gif" style="display: block; margin: auto;" /> ] --- class: inverse, center, middle # La mécanique `ggplot2`: les bases --- class: middle, darkerinverse ## `ggplot2` et la grammaire des graphiques .pull-left[ `ggplot2` a été créé par [Hadley Wickham](http://hadley.nz/), et publié sous le titre _A Layered Grammar of Graphics_ ([2005](https://byrneslab.net/classes/biol607/readings/wickham_layered-grammar.pdf)). L'inspiration vient du livre _The Grammar of Graphics_ ([1999](https://www.google.ca/books/edition/The_Grammar_of_Graphics/NRyGnjeNKJIC?hl=en&gbpv=1&printsec=frontcover)), de Leland Wilkinson. Il propose **une approche structurée en couches pour construire des visualisations** ou des graphiques. ] .pull-right[ !["Source: BloggoType"](images/ggplot-grammar-of-graphics-stack-1.png) ] --- class: middle, darkerinverse ## `ggplot2` et la grammaire des graphiques .pull-left[ **Données** ou **_data_** fournit les ingrédients essentiels pour la figure : - Habituellement, une ligne pour chaque observation que vous voulez tracer. Conseil : Utilisez les outils `tidyverse` pour préparer les données. ] .pull-right[ !["Source: BloggoType"](images/ggplot-grammar-of-graphics-stack-1.png) ] --- class: middle, darkerinverse ## `ggplot2` et la grammaire des graphiques .pull-left2[ **Asthétique** ou **_aesthetics_** (`aes()`) rend les données visibles : - `x`, `y` : variables - `colour` : colore les lignes des géométries - `fill` : remplit les géométries - `group` : regroupe les données en fonction des groupes. - `shape` : définit la forme (point, triangles) - `linetype` : Définit le type de ligne (solide, pointillé) - `size` : Définit la taille des éléments. - `alpha` : Modifie la transparence. ] .pull-right2[ .vertical-center[ .center[ !["Source: BloggoType"](images/ggplot-grammar-of-graphics-stack-1.png) ] ] ] ??? Le présentateur n'a pas besoin de passer du temps à faire mémoriser les commandes aux participants. Elles ne sont là que pour illustrer certaines des possibilités. --- class: middle, darkerinverse ## `ggplot2` et la grammaire des graphiques .pull-left2[ **Géométries** (`geom_*()`) fournit des formes aux données : - `geom_point()` : nuage de points - `geom_line()` : lignes reliant des points - `geom_path()` : lignes reliant les points dans la séquence d'apparition - `geom_boxplot()` : diagramme en boîte pour les variables catégoriques - `geom_bar()` : diagrammes à barres pour l'axe `x` catégorique - `geom_histogram()` : histogramme pour l'axe `x` continu - `geom_violin()` : noyau de distribution de la dispersion des données - `geom_smooth()` : ligne de fonction basée sur les données ] .pull-right2[ .vertical-center[ .center[ !["Source: BloggoType"](images/ggplot-grammar-of-graphics-stack-1.png) ] ] ] ??? Le présentateur n'a pas besoin de passer du temps à faire mémoriser les commandes aux participants. Elles ne sont là que pour illustrer certaines des possibilités. --- class: middle, darkerinverse ## `ggplot2` et la grammaire des graphiques .pull-left2[ **_Facets_** divise les figures entre les panneaux : - `facet_wrap()` enchaîne des graphiques dans différents cadres (facettes) basés sur une seule variable ; - `facet_grid()` fait la même chose que ci-dessus, mais peut prendre différentes variables. ] .pull-right2[ .vertical-center[ .center[ !["Source: BloggoType"](images/ggplot-grammar-of-graphics-stack-1.png) ] ] ] --- class: middle, darkerinverse ## `ggplot2` et la grammaire des graphiques .pull-left2[ **Statistiques** (`stat_*()`) qui sont calculées sur les données. - Les fonctions de type `stat_*()` effectuent des calculs tels que des moyennes, des comptages, des modèles linéaires et d'autres résumés statistiques de données. ] .pull-right2[ .vertical-center[ .center[ !["Source: BloggoType"](images/ggplot-grammar-of-graphics-stack-1.png) ] ] ] --- class: middle, darkerinverse ## `ggplot2` et la grammaire des graphiques .pull-left2[ **Coordonnées** (`coord_*()`) établissent des règles de représentation pour afficher les données - `coord_cartesian()` pour le plan cartésien ; - `coord_polar()` pour les tracés circulaires ; - `coord_map()` pour les différentes projections cartographiques. ] .pull-right2[ .vertical-center[ .center[ !["Source: BloggoType"](images/ggplot-grammar-of-graphics-stack-1.png) ] ] ] --- class: middle, darkerinverse # `ggplot2` et la grammaire des graphiques .pull-left2[ Les **thèmes** (`theme_*()`) permettent d'ajuster les visuels avec précision. - Polices de caractères ; - Couleur de fond ; - La largeur des lignes ; - Taille et couleur des étiquettes d'axe ; - la taille et la couleur des étiquettes de coche ; - et beaucoup, beaucoup d'autres propriétés. ] .pull-right2[ .vertical-center[ .center[ !["Source: BloggoType"](images/ggplot-grammar-of-graphics-stack-1.png) ] ] ] --- # Comment assembler des couches dans `ggplot2` ? 1. Créez un objet de graphique simple : * `plot.object <- ggplot()` 2. Ajouter des couches géométriques : * `plot.object <- plot.object + geom_*()` 3. Ajouter des couches d'apparence : * `plot.object <- plot.object + coord_*() + theme()` 4. Répétez les étapes 2 et 3 jusqu'à ce que vous soyez satisfait, puis affichez : * `plot.object` ou `print(plot.object)` .center[ ![:scale 80%](images/ggplot_basics.png) ] --- # Le jeu de données: `palmerpenguins` .pull-right2[ ![:scale 80%](images/palmerpenguins.png) ] .pull-left2[ Nous allons utiliser le jeu de données `palmerpenguins`. ```r install.packages("palmerpenguins") library(palmerpenguins) ``` .small[Ce jeu de données contient des mesures morphologiques pour trois espèces de manchots observées sur trois îles de l'archipel Palmer, en Antarctique: ] ] ![:scale 50%](images/penguins.png) .center[.xsmall[Artwork by [@allison_horst](https://twitter.com/allison_horst).]] ??? Ces données ont été recueillies de 2007 à 2009 par la Dre Kristen Gorman dans le cadre du programme de recherche écologique à long terme de la station Palmer, qui fait partie du réseau américain de recherche écologique à long terme. Cet ensemble de données est souvent utilisé pour remplacer l'ensemble de données iris, qui pose certains problèmes pour l'enseignement de la science des données, notamment ses liens avec l'eugénisme (plus d'informations à ce sujet sur https://armchairecology.blog/iris-dataset/). Cet ensemble de données a également été utilisé pour un défi TidyTuesday, montrant les nombreuses possibilités de visualisation créative de l'ensemble de données. Par exemple : [ceci](https://twitter.com/LauraNavarroSol/status/1289216490307063814?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1289216490307063814%7Ctwgr%5E%7Ctwcon%5Es1_c10&ref_url=https%3A%2F%2Fnsgrantham.shinyapps.io%2Ftidytuesdayrocks%2F), and [ceci](https://twitter.com/CedScherer/status/1288181995714093057?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1288181995714093057%7Ctwgr%5E%7Ctwcon%5Es1_c10&ref_url=https%3A%2F%2Fnsgrantham.shinyapps.io%2Ftidytuesdayrocks%2F). --- # Le jeu de données: palmerpenguins Regardons les variables du jeu de données des manchots : ```r str(penguins) # tibble [344 × 8] (S3: tbl_df/tbl/data.frame) # $ species : Factor w/ 3 levels "Adelie","Chinstrap",..: 1 1 1 1 1 1 1 1 1 1 ... # $ island : Factor w/ 3 levels "Biscoe","Dream",..: 3 3 3 3 3 3 3 3 3 3 ... # $ bill_length_mm : num [1:344] 39.1 39.5 40.3 NA 36.7 39.3 38.9 39.2 34.1 42 ... # $ bill_depth_mm : num [1:344] 18.7 17.4 18 NA 19.3 20.6 17.8 19.6 18.1 20.2 ... # $ flipper_length_mm: int [1:344] 181 186 195 NA 193 190 181 195 193 190 ... # $ body_mass_g : int [1:344] 3750 3800 3250 NA 3450 3650 3625 4675 3475 4250 ... # $ sex : Factor w/ 2 levels "female","male": 2 1 1 NA 1 2 1 2 NA NA ... # $ year : int [1:344] 2007 2007 2007 2007 2007 2007 2007 2007 2007 2007 ... ``` .center[ ![:scale 45%](images/culmen_depth.png) ] ??? Notez que l'espèce, l'île et le sexe sont des facteurs, qui seront importantes pour regrouper les données avec des couleurs, des formes, etc. dans ggplot2. Il y a ensuite 2 variables numériques (mesures du bec représentées dans l'image), et deux variables entières (longueur des nageoires et masse corporelle). Les données ont également une petite composante temporelle, s'étendant de 2007 à 2009. --- # Préparer les données pour `ggplot2` La librairie `ggplot2` requiert de préparer les données comme un objet de la classe "data.frame" ou "tibble" (commun dans l'univers `tidyverse`). ```r library(tibble) class(penguins) # Tout est prêt ! # [1] "tbl_df" "tbl" "data.frame" peng <- as_tibble(penguins) # acceptable class(peng) # [1] "tbl_df" "tbl" "data.frame" ``` <br> **♻ Rappel de l'atelier [*Charger et manipuler des données*](https://r.qcbs.ca/fr/workshops/r-workshop-03/)**: Les graphiques plus complexes dans les `ggplot2` nécessitent que les données soient en format long. --- # Questions scientifiques à propos des manchots .center[ ![:scale 50%](images/culmen_depth.png) ] .center[**Questions scientifiques**] <br> - Existe-t-il une relation entre la **longueur** et la **profondeur** des becs ? - Est-ce que la taille du **bâton et de la nageoire** varient ensemble ? - Comment ces mesures sont-elles réparties parmi les **3 espèces de manchots** ? .center[.alert[Comment pouvons-nous répondre graphiquement à ces questions avec `ggplot2`?]] --- # Explorer la structure des données: <!-- Explain the databases before the examples --> ```r library(GGally) ggpairs(penguins, aes(colour = species)) + theme_bw() ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-12-1.png" width="738" style="display: block; margin: auto;" /> ??? ggpairs est dans la librairie GGally (chargée et installée au début de l'atelier). ggpairs (version ggplot du paquet psych) nous permet d'explorer les corrélations dans les données. On peut déjà voir certains regroupements d'espèces entre la longueur et la profondeur du bec, la longueur des nageoires et la masse corporelle. Lors de la visualisation, il faudra garder à l'esprit que la différenciation des espèces peut être importante. --- # `ggplot()` : couche "données" ou "_Data_" ```r ggplot(data = penguins) # # # # ``` --- # `ggplot()` : couche "esthétique" ou "_aesthetics_" ```r ggplot(data = penguins, aes(x = bill_length_mm, y = bill_depth_mm)) # # # ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-15-1.png" width="432" style="display: block; margin: auto;" /> --- # `ggplot()` : couche "géométries" ou "_geometries_" ```r ggplot(data = penguins, aes(x = bill_length_mm, y = bill_depth_mm)) + geom_point() # # ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-17-1.png" width="432" style="display: block; margin: auto;" /> ??? Notez que le code ggplot2 est plus facile à lire si chaque ligne représente un nouvel élément. Ce style est généralement privilégié pour le code ggplot2 dans la communauté R. --- # `ggplot()`: couches "facettes" et "coordonnées" * ```r ggplot(data = penguins, aes(x = bill_length_mm, y = bill_depth_mm)) + geom_point() + facet_wrap(~species) + coord_trans(x = "log10", y = "log10") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-18-1.png" width="432" style="display: block; margin: auto;" /> .xsmall[*"coordinates" ou "_facets_"] --- # Tout mettre ensemble, en un seul code Explorons comment certaines de ces données sont structurées par espèce : ```r ggplot(data = penguins, # Données aes(x = bill_length_mm, # Valeurs X y = bill_depth_mm, # Valeurs Y col = species)) + # Esthétique (mettre une couleur par espèce) geom_point(size = 5, alpha = 0.8) + # Points geom_smooth(method = "lm") + # Régression linéaire labs(title = "Relation entre la longueur et la profondeur du bec\ndes différentes espèces de manchots.", # Title x = "Longueur du bec (mm)", # titre de l'axe des X y = "Profondeur du bec (mm)", # titre de l'axe des Y col = "Espèces") + # Légende pour les couleurs dans aes(col = species) theme_classic() + # Utiliser un thème propre theme(title = element_text(size = 18, face = "bold"), text = element_text(size = 16)) ``` .small[♻ Voir l'atelier [*Charger et manipuler des données*](https://r.qcbs.ca/fr/workshops/r-workshop-02/) pour apprendre comment nettoyer et manipuler vos données.] ??? Prenez le temps d'expliquer chaque ligne de code (surtout l'esthétique et les géomètres), et ce qu'elle nous dit. Par exemple, en différenciant les espèces, on peut voir qu'il existe une relation assez cohérente entre la longueur et la profondeur du bec entre les espèces (pentes similaires), mais que les gammes de ces variables sont différentes (les regroupements sont clairement indiqués par les couleurs). Les manchots Adélie ont tendance à avoir une longueur de bec plus petite mais une profondeur de bec assez grande, alors que l'inverse est vrai pour les manchots Gentoo. --- # Tout mettre ensemble, en une seule figure Explorons comment ces données sont structurées par espèce: <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-20-1.png" width="576" style="display: block; margin: auto;" /> .small[♻ Voir l'atelier [*Charger et manipuler des données*](https://r.qcbs.ca/fr/workshops/r-workshop-02/) pour apprendre comment nettoyer et manipuler vos données.] ??? Prenez le temps d'expliquer chaque ligne de code (surtout l'esthétique et les géomètres), et ce qu'elle nous dit. Par exemple, en différenciant les espèces, on peut voir qu'il existe une relation assez cohérente entre la longueur et la profondeur du bec entre les espèces (pentes similaires), mais que les gammes de ces variables sont différentes (les regroupements sont clairement indiqués par les couleurs). Les manchots Adélie ont tendance à avoir une longueur de bec plus petite mais une profondeur de bec assez grande, alors que l'inverse est vrai pour les manchots Gentoo. --- # Défi 1 (5-min) ![:cube]() **Codez et représentez votre premier objet `ggplot()` !**. **Votre mission** : représenter visuellement et répondre si : 1. Il existe une relation apparente entre la **longueur du bec** et la **longueur de la nageoire**. 2. **La longueur du bec** *augmente* avec la **longueur de la nageoire**. <br> .center[Paramètres à prendre en compte pour répondre à cette question :] données | géométrie | valeurs x | valeurs y :-------------:|:-------------:|:-------------:|:-------------: `penguins`|`geom_point()`|`bill_length_mm`|`flipper_length_mm`
−
+
05
:
00
--- # Défi 1: Solution ![:cube]() ```r ggplot(data = penguins, aes(x = bill_length_mm, y = flipper_length_mm)) + geom_point() ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-22-1.png" width="432" style="display: block; margin: auto;" /> --- # Défi 1: Solution ![:cube]() .pull-left2[ ```r ggplot(data = penguins, aes(x = bill_length_mm, y = flipper_length_mm)) + geom_point() ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-23-1.png" width="432" style="display: block; margin: auto;" /> ] .pull-right2[ **Note** : l'esthétique peut être soit dans la ligne `ggplot()`, et sera héritée par chaque `geom_*()`, soit dans la ligne `geom_*()` pour s'appliquer à ce `geom_*()` seulement ! ] --- # Défi 1: Solution ![:cube]() .pull-left2[ ```r ggplot(data = penguins, aes(x = bill_length_mm, y = flipper_length_mm)) + geom_point(shape = 2, color = "blue") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-24-1.png" width="432" style="display: block; margin: auto;" /> ] .pull-right2[ **Note** : l'esthétique peut être soit dans la ligne `ggplot()`, et sera héritée par chaque `geom_*()`, soit dans la ligne `geom_*()` pour s'appliquer à ce `geom_*()` seulement ! <br> **Note 2**: les commandes `colour`, `alpha`, `shape`, et `size` peuvent être définies en dehors des valeurs de `aes()`, et seront alors statiques, non dépendantes des données. ] --- class: inverse, center, middle # Esthétique ou *Aesthetic mappings* ## couleur, forme, taille, étiquettes et transparence --- # Esthétique **Utiliser l'esthétique `aes()` pour distinguer les classes, les groupes et la structure** ![:scale 70%](images/4plot_aesthetic.png) --- # Les couleurs: faites parler vos données Changez la **couleur** pour ![:faic](arrow-right) différencier entre des groupes ![:faic](arrow-right) représenter les valeurs des données ![:faic](arrow-right) mettre en évidence des éléments spécifiques .pull-left[ <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-25-1.png" width="360" style="display: block; margin: auto;" /> ] .pull-right[ <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-26-1.png" width="360" style="display: block; margin: auto;" /> ] .footnote[Voir [Fundamentals of Data Visualization](https://serialmentor.com/dataviz/colour-basics.html)] --- # Utiliser `aes()` pour changer les couleurs La longueur des becs et des nageoires varient-elles selon les espèces ? .pull-left[ ```r # No colour mapping ggplot(data = penguins, aes(x = bill_length_mm, y = flipper_length_mm)) + geom_point() + geom_smooth(method = lm)+ labs(title = "Sans code de couleur") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-27-1.png" width="432" /> ] .pull-right[ ```r # With colour mapping ggplot(data = penguins, aes(x = bill_length_mm, y = flipper_length_mm, col = species)) + geom_point() + geom_smooth(method=lm) + labs(title = "Avec code de couleur") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-28-1.png" width="432" /> ] --- # Changer les couleurs manuellement .pull-left[ ```r # Défaut pp <- ggplot(data = penguins) + geom_point(aes(x = bill_length_mm, y = bill_depth_mm, colour = species)) pp + labs(title = "Défaut") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-29-1.png" width="432" /> ] .pull-right[ ```r # Personnalisé pp + scale_colour_manual( values = c("grey55", "orange", "skyblue")) + labs(title = "Personnalisé") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-30-1.png" width="432" /> ] ??? scale_colour_manual() et scale_fill_manual() permettent de choisir des colours, mais c'est important de s'assurer que les couleurs choisies sont un bon choix pour la visualisation (claires, assez de contraste, etc.). Plus sur ceci dans quelques diapos! --- # Gradient de couleurs .pull-left[ ```r pp2 <- ggplot(data = penguins) + geom_point(aes(x = bill_length_mm, y = bill_depth_mm, colour = body_mass_g)) pp2 + labs(title = "Défaut") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-31-1.png" width="432" /> ] .pull-right[ ```r pp2 + scale_colour_gradient(low = "blue", high = "red") + labs(title = "Personnalisé") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-32-1.png" width="432" /> ] ??? Il y a aussi scale_colour_gradient2() pour créer un gradient avec une valeur 'midpoint' pour un gradient qui diverge. --- # Utiliser une palette de couleurs prédéfinie ```r install.packages("RColorBrewer") library(RColorBrewer) display.brewer.all() ``` ![:scale 100%](images/rcolorbrewer_palette.png) --- # Utiliser une palette de couleurs prédéfinie ```r pp + scale_colour_brewer(palette = "Dark2") + labs(title = "Palette pour des groupes") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-34-1.png" width="468" style="display: block; margin: auto;" /> --- # Utiliser une palette de couleurs prédéfinie ```r pp2 + scale_color_viridis_c()+ labs(title = "Palette pour des variables continues") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-35-1.png" width="468" style="display: block; margin: auto;" /> --- # Utiliser une palette de couleurs prédéfinie Palette de gris pour la publication ```r pp + scale_colour_grey() + labs(title = "Palette pour des groupes") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-36-1.png" width="468" style="display: block; margin: auto;" /> --- # Utiliser une palette de couleurs prédéfinie ```r pp2 + scale_colour_gradient(low = "grey85", high = "black") + labs(title = "Palette pour des variables continues") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-37-1.png" width="468" style="display: block; margin: auto;" /> --- # Utiliser des palettes de couleurs visibles pour les daltoniens Comment votre figure peut-elle apparaître sous différentes formes de daltonisme ? Nous pouvons utiliser [colorBlindness](https://cran.r-project.org/web/packages/colorBlindness/index.html). ```r install.packages("colorBlindness") library(colorBlindness) ``` --- # Utiliser des palettes de couleurs visibles pour les daltoniens ```r cvdPlot(pp) ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-38-1.png" width="792" style="display: block; margin: auto;" /> ??? Comme vous pouvez le constater, notre palette de couleurs actuelle n'est pas accessible ! En utilisant les palettes [`viridis`](https://cran.r-project.org/web/packages/viridis/vignettes/intro-to-viridis.html), nous pouvons garantir que nos graphiques communiquent toujours les mêmes informations, quel que soit le public. --- # Utiliser des palettes de couleurs visibles pour les daltoniens .pull-left[ ```r pp + scale_colour_viridis_d() + labs(title = "Palette viridis pour des groupes") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-39-1.png" width="432" style="display: block; margin: auto;" /> ] .pull-right[ ```r pp2 + scale_colour_viridis_c() + labs(title = "Palette viridis pour des variables continues") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-40-1.png" width="432" style="display: block; margin: auto;" /> ] ??? Vous pouvez faire une démonstration de cvdPlot() pendant l'atelier sur ces graphiques pour montrer la différence si vous le souhaitez. --- # Changer la forme, la taille et la transparence .pull-left[ ```r ggplot(data = penguins) + geom_point(aes(x = bill_length_mm, y = bill_depth_mm, shape = species)) + labs(title = "Formes pour des groupes") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-41-1.png" width="432" style="display: block; margin: auto;" /> ] .pull-right[ ```r ggplot(data = penguins) + geom_point(aes(x = bill_length_mm, y = bill_depth_mm, size = body_mass_g, alpha = flipper_length_mm)) + labs(title = "Taille et transparence pour des variables continues") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-42-1.png" width="432" style="display: block; margin: auto;" /> ] ??? Notez que le fait de définir simultanément de nombreuses variables pour les repères visuels tels que la couleur, la forme, la taille et l'alpha a tendance à être excessif pour le lecteur. L'ajout de quatre niveaux de complexité à la représentation en 2D des points peut être trop important pour être bien interprété. Il est préférable de choisir les indices visuels et les variables clés pour le message souhaité plutôt que de surcharger un graphique avec toutes les possibilités de la fonction aes(). --- # Défi 2 ![:cube]() - Créer un graphique informatif à partir de jeu de données disponible de R, comme `mtcars`, `CO2` ou `msleep`. - Utiliser les esthétiques appropriés pour différents types de données <br> Données | x | y | Esthétiques :-------------:|:-------------:|:-------------:|:-------------: mtcars |*wt* |*mpg* | *disp* et *hp* CO2 |*conc* |*uptake* | *Treatment* et *Type* msleep |log10(*bodywt*) |*awake* | *vore* et *conservation* ToothGrowth | *dose* | *len* | *supp* <br> .center[.alert[ ![:faic](exclamation-triangle) Faites attention aux types de données ! ] ] --- # Défi #2 ![:cube]() #### .alert[Salles de réunion ! - 15 min] <br> Créez un graphique à partager avec le groupe ??? note: _assign each group a dataset to make a plot from: mtcars, CO2, msleep, and ToothGrowth to make exploratory plots_ --- # Défi 2 - Solution exemple 1 .small[ Données | x | y | Esthétiques :-------------:|:-------------:|:-------------:|:-------------: mtcars |*wt* |*mpg* | *disp* et *hp* ] ```r data(mtcars) ggplot(data = mtcars) + geom_point(aes(x = wt, y = mpg, colour = disp, alpha = hp)) ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-43-1.png" width="432" style="display: block; margin: auto;" /> .comment[Pourriez-vous utiliser `size` au lieu de `alpha`? Et `shape`?] --- # Défi 2 - Solution exemple 2 .small[ Données | x | y | Esthétiques :-------------:|:-------------:|:-------------:|:-------------: CO2 |*conc* |*uptake* | *Treatment* et *Type* ] ```r data(CO2) ggplot(data = CO2) + geom_point(aes(x = conc, y = uptake, colour = Treatment, shape = Type)) ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-44-1.png" width="432" style="display: block; margin: auto;" /> .comment[Pourquoi ne pas utiliser `size = Type`?] --- # Défi 2 - Solution exemple 3 .small[ Données | x | y | Esthétiques :-------------:|:-------------:|:-------------:|:-------------: msleep |log10(*bodywt*) |*awake* | *vore* et *conservation* ] ```r data(msleep) ggplot(data = msleep) + geom_point(aes(x = log10(bodywt), y = awake, colour = vore, shape = conservation)) ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-45-1.png" width="432" style="display: block; margin: auto;" /> --- # Défi 2 - Solution exemple 4 .small[ Données | x | y | Esthétiques :-------------:|:-------------:|:-------------:|:-------------: ToothGrowth | *dose* | *len* | *supp* ] ```r data(ToothGrowth) ggplot(ToothGrowth, aes(x = dose, y = len, color = supp)) + geom_point() + geom_smooth(method = lm, formula = 'y~x') ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-46-1.png" width="432" style="display: block; margin: auto;" /> --- class: small-code # Changer l'échelle des axes .tiny[ .pull-left[ ```r ggplot(diamonds) + geom_point(aes(x = carat, y = price)) + labs(title = "Échelle originale") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-47-1.png" width="432" style="display: block; margin: auto;" /> ] ] .pull-right[ ```r ggplot(diamonds) + geom_point(aes(x = carat, y = price)) + coord_trans(x = "log10", y = "log10") + labs(title = "Échelle log10") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-48-1.png" width="432" style="display: block; margin: auto;" /> ] <br> .small[Il est également possible de transformer le système de coordonnées en utilisant `scale_x_log10()` et `scale_y_log10()`.] ??? Expliquer la différence et pourquoi la transformation peut être utile pour la visualisation. Par exemple, la masse corporelle est souvent transformée avec log10. --- class: inverse, center, middle # Peaufinage # Utiliser le `theme()` pour faire bonne figure! --- # `theme()` **Par défaut: theme_grey()** ```r # Theme grey pp + scale_colour_grey() + theme_grey() + labs(title = "Défaut: Thème gris") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-49-1.png" width="432" style="display: block; margin: auto;" /> --- # `theme()` .pull-left[ **Thème classique** ```r pp + scale_colour_grey() + theme_classic() + labs(title = "Thème classique") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-50-1.png" width="432" style="display: block; margin: auto;" /> ] .pull-right[ **Thème minimal** ```r pp + scale_colour_grey() + theme_minimal() + labs(title = "Thème minimal") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-51-1.png" width="432" style="display: block; margin: auto;" /> ] .footnote[NB: De bons choix pour la publication !] ??? Cette présentation a utilisé theme_classic() pour les figures, puisque le fond gris rend certaines couleurs difficiles à voir. Ces thèmes sont des bonnes options pour publier des figures. --- # `theme()` Utiliser `theme_set()` pour changer le thème pour tous vos prochains graphiques, ou `theme_update()` pour modifier certains aspects d'un thème. .pull-left[ **Définir le thème** ```r # Choisir le thème par défaut theme_set(theme_bw()) pp ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-52-1.png" width="468" style="display: block; margin: auto;" /> ] .pull-right[ **Mettre à jour le thème** ```r # supprimer la grille mineure theme_update(panel.grid.minor = element_blank()) pp ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-53-1.png" width="468" style="display: block; margin: auto;" /> ] --- exclude: true # ggThemeAssist: Extension de RStudio ![!scale: 50%](https://raw.githubusercontent.com/calligross/ggthemeassist/master/examples/ggThemeAssist2.gif) ??? note: _removed this slide to add theme image instead_ --- # `theme()` Les élements d'un thème par ([Isabella Benabaye](https://isabella-b.com/blog/ggplot2-theme-elements-reference/)). ![:scale 90%](images/ggthemes.png) --- class: inverse, center, middle # Peaufiner vos graphiques # Des facettes pour pour diviser votre graphique --- # Facettes selon une variable ```r ggplot(data = penguins) + geom_point(mapping = aes(x = bill_length_mm, y = bill_depth_mm, colour = species)) + facet_grid(~ species, scales = "free") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-55-1.png" width="576" style="display: block; margin: auto;" /> ??? L'échelle de l'axe des y peut varier entre les facettes. Ne faites pas scales = 'free' si vous comparez des facettes via l'axe des y ! --- # Facettes selon deux variables ```r ggplot(data = penguins) + geom_point(mapping = aes(x = bill_length_mm, y = bill_depth_mm, colour = species)) + facet_grid(year ~ species, scales = "free") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-56-1.png" width="576" style="display: block; margin: auto;" /> --- exclude: true # Titre et axes: changer la taille, la couleur et l'apparence .center[![:scale 90%](images/theme_iris_annotated.png)] ??? This is redundant with the elements of a theme figure from slide 74, and now out of date due to the removal of iris. --- # Titre et axes: changer la taille, la couleur et l'apparence .pull-left[ **Défaut** <br><br> <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-57-1.png" width="396" style="display: block; margin: auto;" /> ] .pull-right[ **Ajustement des axes et du titre** <br><br> <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-58-1.png" width="396" style="display: block; margin: auto;" /> ] --- # Défi 3 ![:cube]() Utilisez les données `tips` qui se trouvent dans `reshape2` 📦 pour reproduire le graphique ci-dessous. Notre conseil: Allez-y étape par étape! Commencez par `theme_classic()` et ajoutez `theme()` pour faire vos changements supplémentaires. <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-59-1.png" width="720" style="display: block; margin: auto;" /> --- # Défi 3 ![:cube]() #### .alert[Salles de réunion! - 15 min] ??? note: _give teams time to work together to recreate this plot. Refer to theme elements slide_ --- # Défi 3: Solution![:cube]() ```r library(reshape2) tips.gg <- ggplot(tips, aes(x = total_bill, y = tip/total_bill, shape = smoker, colour = sex, size = size)) + geom_point() + facet_grid( ~ time) + scale_colour_grey() + labs(title = "Relation entre la facture totale et les pourboires pendant les repas", x = "Facture totale ($)", y = "Ratio entre pourboires et facture totale") + theme_classic() + theme(axis.title = element_text(size = 16, colour = "navy"), axis.text = element_text(size = 12), plot.title = element_text(size = 16, colour = "orange3", face = "bold"), strip.text.x = element_text(size = 14, face ="bold")) tips.gg ``` --- # Défi 3: solution par étapes #### `aes()` ```r tips.gg <- ggplot(tips) + geom_point(mapping = aes(x = total_bill, y = tip/total_bill, shape = smoker, colour = sex, size = size)) + theme_classic() tips.gg ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-61-1.png" width="504" style="display: block; margin: auto;" /> --- # Défi 3: solution par étapes #### `facet_grid()` ```r tips.gg <- tips.gg + facet_grid( ~ time) tips.gg ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-63-1.png" width="504" style="display: block; margin: auto;" /> --- # Défi 3: solution par étapes #### Palette de gris ```r tips.gg <- tips.gg + scale_colour_grey() tips.gg ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-64-1.png" width="504" style="display: block; margin: auto;" /> --- # Défi 3: solution par étapes #### Ajout du titre et des étiquettes du graphique ```r tips.gg <- tips.gg + labs(title = "Relation entre la facture totale et les pourboires pendant les repas", x = "Facture totale ($)", y = "Ratio entre pourboires et facture totale") tips.gg ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-65-1.png" width="504" style="display: block; margin: auto;" /> --- # Défi 3: solution par étapes #### Ajout et ajustement du thème .small[ ```r tips.gg <- tips.gg + theme_classic() + theme(axis.title = element_text(size = 16, colour = "navy"), axis.text = element_text(size = 12), plot.title = element_text(size = 16, colour = "orange3", face = "bold"), strip.text.x = element_text(size = 14, face = "bold")) tips.gg ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-66-1.png" width="720" style="display: block; margin: auto;" /> ] --- class: inverse, center, middle # Peaufiner vos graphiques # Utiliser `geom_*()` pour créer différents types de graphique --- # `ggplot2::geom_*()` .center[ ![:scale 85%](images/plots_in_various_contexts.png) ] --- exclude: true # `base::plot()` .center[ ![:scale 85%](images/plots_in_various_contexts_baseplot.png) ] ??? note: removed this slide. Not sure why it's here. --- # `ggplot2::ggplot()` Sans `geom_*` pour représenter des variables, on a une figure vide: ```r ggplot(penguins) ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-68-1.png" width="432" style="display: block; margin: auto;" /> --- # Histogrammes: `geom_histogram()` Un **histogramme** est une représentation graphique précise de la répartition des données numériques - une seule esthétique requise: la variable `x`. ```r ggplot(penguins, aes(x = bill_length_mm)) + geom_histogram() + ggtitle("Histogramme de la longeur des becs") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-69-1.png" width="432" style="display: block; margin: auto;" /> --- # Nuage de points et régression linéaire: `geom_point()` et `geom_smooth()` .small[ .pull-left[ ```r ggplot(mpg, aes(displ, hwy)) + geom_point() + labs(title = "Nuage de points") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-70-1.png" width="396" style="display: block; margin: auto;" /> ] .pull-right[ ```r ggplot(mpg, aes(displ, hwy)) + geom_point() + labs(title = "Régression linéaire") + geom_smooth(method = lm) ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-71-1.png" width="396" style="display: block; margin: auto;" /> ] ] ??? Un nuage de points est un excellent moyen de visualiser des points de données pour deux variables. Deux esthétiques sont requises dans `geom_point()` : les variables `x` et `y`. Il peut cependant être difficile de discerner toute relation potentielle dans un nuage de points. Vous pouvez utiliser `geom_smooth()` pour ajuster une ligne à travers vos données avec une variété de méthodes. Ici, nous allons ajouter un ajustement linéaire au nuage de points. --- # Diagramme en boîte: `geom_boxplot()` ```r ggplot(data = penguins, aes(x = species, y = bill_length_mm, fill = species)) + geom_boxplot() + labs(title = "Diagramme en boîte") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-72-1.png" width="432" style="display: block; margin: auto;" /> --- # Diagramme en boîte: `geom_boxplot()` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-73-1.png" width="360" style="display: block; margin: auto;" /> .center[ ![:scale 75%](images/boxplot_explain.png) ] ??? Les boxplots sont un moyen populaire de représenter la distribution des données en fonction d'une variable de regroupement, comme les espèces. Vous pouvez spécifier cette variable de regroupement dans `aes()` en utilisant `group =`, ou l'esthétique utilisée pour représenter les données (`fill =`, `col =`, `shape =`) pour générer le boxplot. Bien que les boxplots soient très populaires pour résumer des données, quelqu'un qui regarde votre graphique peut ne pas comprendre intuitivement comment fonctionne ce résumé et ce qu'il peut cacher. Pour bien utiliser les boxplots, il faut en comprendre l'anatomie, comme indiqué ci-dessous. Plus d'informations sur les pièges des boxplots [ici](https://www.data-to-viz.com/caveat/boxplot.html). --- # Diagramme en boîte avec annotations: `geom_boxplot()` et `geom_signif()` .pull-left3[ ```r library(ggsignif) ggplot(data = penguins, aes(x = species, y= bill_length_mm, fill = species)) + geom_boxplot() + geom_signif(comparisons = list(c("Adelie", "Gentoo")), map_signif_level=TRUE) ``` ] .pull-right3[ <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-75-1.png" width="432" style="display: block; margin: auto;" /> ] ??? Pour guider l'interprétation des boxplots, nous pouvons ajouter des annotations avec `geom_signif()`. La fonction `geom_signif()` calcule la signification d'une différence entre les groupes et ajoute l'annotation au graphique en une seule ligne. --- # Diagramme en violon: `geom_violin()` Comme expliqué sur le site [from Data to Viz](https://www.data-to-viz.com/graph/violin.html) > Le graphique en forme de violon permet de visualiser la distribution d'une variable numérique pour un ou plusieurs groupes. [...] Il est très proche du diagramme en boîte, mais permet une compréhension plus approfondie de la distribution. .pull-left[ <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-76-1.png" width="432" style="display: block; margin: auto;" /> ] .pull-right[ <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-77-1.png" width="432" style="display: block; margin: auto;" /> ] --- # Diagramme en violon: `geom_violin()` ```r violin <- ggplot(data = penguins, aes(x = species, y = bill_length_mm)) + geom_violin(trim = FALSE, fill = "grey70", alpha = .5) + labs(title = "Violin plot") violin ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-78-1.png" width="432" style="display: block; margin: auto;" /> ??? Comme les boxplots, les diagrammes en violon visualisent la distribution d'une variable numérique pour un ou plusieurs groupes. Cependant, la forme d'un violon représente la distribution des points qui est masquée dans le résumé d'un boxplot, ce qui permet une représentation plus précise des données ([Data-to-Viz)](https://www.data-to-viz.com/graph/violin.html)). Comparons un boxplot et un violin plot sur des données générées. Remarquez que le diagramme en violon *montre* l'étendue **et** la variabilité de nos données, alors que le boxplot ne peut pas communiquer ces deux éléments de manière aussi intuitive. --- # Diagramme en violon: `geom_violin()` + `_boxplot()` + `_jitter()` ```r violin + geom_jitter(shape = 16, position = position_jitter(0.2), alpha = .3) + geom_boxplot(width = .05) ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-79-1.png" width="432" style="display: block; margin: auto;" /> ??? Bien que nous ayons une bonne idée de la façon dont les données sont distribuées, nous pouvons améliorer le graphique en visualisant certaines statistiques sommaires et les points de données. Traçons un boxplot et les points de données *sur* notre graphique de violon avec `geom_violin()` + `geom_boxplot()` + `geom_jitter()`. --- # Résumer des valeurs: `stat_summary()` .pull-left[ ```r ggplot(mtcars, aes(cyl, mpg)) + geom_point() + stat_summary(fun = "mean", geom = "point", colour = "red", size = 5) + labs(title = "Moyenne") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-80-1.png" width="288" style="display: block; margin: auto;" /> ] .pull-right[ ```r ggplot(mtcars, aes(cyl, mpg)) + geom_point() + stat_summary(fun.data = "mean_cl_boot", colour = "red", size = 2) + labs(title = "Moyenne et intervalle de confiance") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-81-1.png" width="288" style="display: block; margin: auto;" /> ] --- # Résumer des valeurs Pour afficher d'autres statistiques, consultez: - `geom_errorbar()` - `geom_pointrange()` - `geom_linerange()` - `geom_crossbar()` - et autres! --- # Créer des cartes: `geom_map()` .small[ ```r # charger la librairie maps library(maps) states_map <- map_data("state") # obtient une carte des Etats-Unis à l'échelle des états # Le nom de l'état est défini comme rownames. Créons une nouvelle colonne pour ceux-ci # qui correspond à la colonne des noms d'états dans notre states_map. USArrests$region <- tolower(rownames(USArrests)) # Construisons notre carte ggplot(USArrests, aes(map_id = region)) + # le nom de la variable pour lier notre carte et notre dataframe geom_map(aes(fill = Murder), # variable que nous voulons représenter avec une esthétique map = states_map) + # cadre de données qui contient des coordonnées expand_limits(x = states_map$long, y = states_map$lat) + coord_map() + # projection labs(x = "", y = "") # suppression des titres des axes ``` ] ??? USArrests : Violent Crime Rates by US State dataset, inclus dans R. Cet ensemble de données contient des statistiques, en arrestations pour 100 000 résidents pour agression, meurtre et viol dans chacun des 50 États américains en 1973. Le pourcentage de la population vivant dans des zones urbaines est également indiqué. La carte se trouve sur la diapositive suivante. N'hésitez pas à passer d'une diapositive à l'autre pour expliquer chaque élément si la cartographie suscite de l'intérêt. --- # Créer des cartes: `geom_map()` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-83-1.png" width="720" style="display: block; margin: auto;" /> --- # Graphique de densité: `geom_density()` .small[Un graphique de densité montre la distribution d'une variable numérique et il ne prend qu'un ensemble de valeurs numériques comme entrée.] .pull-left[ ```r (peng.dens <- ggplot(penguins, aes(x = bill_length_mm)) + geom_density()) ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-84-1.png" width="360" style="display: block; margin: auto;" /> ] .pull-right[ ```r (cars.dens <- ggplot(cars, aes(x = dist)) + geom_density()) ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-85-1.png" width="360" style="display: block; margin: auto;" /> ] ??? Envelopper les objets de graphique dans () les imprime à chaque fois que ces lignes sont exécutées, plutôt que d'imprimer l'objet de graphique sur une autre ligne comme nous l'avons fait. --- # Dendogramme: `ggdendrogram()` Quels états américains ont des taux d'arrestation similaires ? ```r library(ggdendro) USArrests.short = USArrests[1:10,] hc <- hclust(dist(USArrests.short), "ave") ggdendrogram(hc, rotate = TRUE, theme_dendro = FALSE) ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-86-1.png" width="432" style="display: block; margin: auto;" /> --- # Disposition des graphiques: `patchwork` ```r # install.packages("patchwork") library(patchwork) peng.dens + cars.dens + plot_annotation(tag_levels = 'a') ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-87-1.png" width="648" style="display: block; margin: auto;" /> ??? Jusqu'à présent, nous avons utilisé des facettes pour diviser notre graphique en plusieurs fenêtres. Cependant, ceci est limité au traçage des mêmes variables à partir du même ensemble de données. Le paquet `patchwork` permet d'arranger facilement des ggplots distincts dans un même cadre avec `+` (arranger les graphes les uns à côté des autres), `/` (arranger un graphe par-dessus l'autre), `()` (grouper cet arrangement de graphes) comme si vous écriviez une équation. --- # Défi 4 ![:cube]() Créez votre propre graphique et suivez ces recommandations : * Jeu de données : n'importe lequel (recommandation : utilisez votre jeu de données) * Explorez un nouveau `geom_*` et d'autres couches de graphiques Utilisez les liens suivants pour obtenir des conseils : - [ggplot2 Reference](https://ggplot2.tidyverse.org/reference/index.html) - [R Graph Gallery](https://www.r-graph-gallery.com/ggplot2-package.html) - [Data to Viz](https://www.data-to-viz.com/) --- # Défi 4: Solution exemple 1 .small[ ```r data(msleep) ggplot(msleep, aes(x = vore, y = log10(brainwt), fill = vore)) + geom_violin() + geom_signif(comparisons = list(c("herbi", "insecti"))) + labs("Poids du cerveau pour les différents -vores", y = "log10(Poids du cerveau (Kg))") + scale_fill_grey() + theme_classic() ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-88-1.png" width="432" style="display: block; margin: auto;" /> ] --- # Défi 4: Solution exemple 2 .small[ ```r data(mtcars) # let's do some clustering! mtcars.short <- mtcars[1:20,] mtcars.short.hc <- hclust(dist(mtcars.short), "average") ggdendrogram(mtcars.short.hc, rotate = TRUE) + # fine-tuning labs(title = "Dendrogramme des voitures selon les spécifications du moteur", y ="Voitures") ``` <img src="workshop03-pres-fr_files/figure-html/unnamed-chunk-90-1.png" width="360" style="display: block; margin: auto;" /> ] --- # Divers : graphiques interactifs avec `plotly()` .small[ ```r library(plotly) p <- ggplot(penguins, aes(x = bill_length_mm, y = bill_depth_mm, colour = species, shape = species)) + geom_point(size=6, alpha=0.6) # convertir en objet plotly ggplotly(p) ```
] ??? La librairie `plotly()` contient la fonction `ggplotly()`, qui traduit votre code `ggplot` en un objet interactif `plotly` en une seule ligne de code. Vous pouvez cliquer sur les espèces dans la légende pour ajouter/supprimer des espèces. Vous pouvez également voir les valeurs en passant la souris sur les points. --- class: inverse, center, middle # Sauvegarder vos graphiques --- exclude: true # Sauvegarder des graphiques en RStudio <div style="text-align:center"> <img src="images/save_image.png" height=60% width=60%> </div> .small[ .alert[Pensez à la marge du document que vous utilisez. Si vous redimensionnez l'image après l'avoir enregistrée, les étiquettes et le texte changeront également de taille, ce qui pourrait être difficile à lire. ] ] --- # Sauvegarder des graphiques à l'aide de fonction R `ggsave()` écrit directement dans votre répertoire de travail et vous permet de spécifier le nom du fichier, les dimensions du graphique, la résolution, etc. ```r mon_1er_graph <- ggplot(penguins, aes(x = bill_length_mm, y = bill_depth_mm)) + geom_point() ggsave("mon_1er_graph.pdf", mon_1er_graph, height = 8.5, width = 11, units = "in", res = 300) ``` NB: Le format vectoriel (par exemple, pdf, svg) est plus flexible que le format raster (jpeg, png, ...) si l'image doit être modifiée par la suite. **Astuce:** Les fonctions `quartz()` (sur mac) ou `window()` (sur pc) facilitent la mise en forme avant de sauvegarder avec `ggsave()`! ??? Astuce : Les fonctions `quartz()` (mac) ou `window()` (pc) facilitent le dimensionnement avant `ggsave()` ! Tracez simplement votre ggplot dans quartz() ou window(), ajustez la taille jusqu'à ce qu'elle soit bonne, et lancez ggsave() avec le nom du fichier pour voir quelles dimensions vous avez utilisées ! Vous pouvez ensuite ajouter ceci dans votre code avec height = et width = comme indiqué ci-dessus. --- # Sauvegarder des graphiques à l'aide de fonction R <br> Autres méthodes de sauvegarde des figures: voir `?pdf` `?jpeg` ```r pdf("./graph_du_jour.pdf") print(mon_1er_graph) # la fonction print est nécessaire graphics.off() ``` --- class: inverse, center, middle # Considérations finales --- # Ressources additionelles - `help(package = ggplot2)` - [Data Visualization with ggplot2 Cheat Sheet](https://github.com/rstudio/cheatsheets/raw/master/data-visualization.pdf) - [ggplot2 Reference](http://ggplot2.tidyverse.org/reference/) - [Fundamentals of Data Visualization](https://serialmentor.com/dataviz/) - [From Data to Viz](https://www.data-to-viz.com/) - [A Compendium of Clean Graphs in R](https://www.shinyapps.org/apps/RGraphCompendium/index.php#line-plots) (base R) - [Graphics Principles](https://graphicsprinciples.github.io/) (design tips) - [The R Graph gallery](https://www.r-graph-gallery.com) - Lecture notes from Hadley's course Stat 405 (the other lessons are awesome too!) - <http://stat405.had.co.nz/lectures/11-adv-data-manip.pdf> - <http://stat405.had.co.nz/lectures/19-tables.pdf> ??? Montrer la fiche de référence pour ggplot2 https://github.com/rstudio/cheatsheets/raw/master/data-visualization.pdf --- # Ressources additionelles .center[![:scale 65%](images/ggplot_book.png)] --- # Considérations finales Il y a d'autres librairies utiles qui peuvent être utilisés avec `ggplot2` ! Pour en nommer quelques-uns : `ggbio`, `ggpmisc`, `geomnet`, `gganimate`, `ggnetwork` et `ggtree`. Jetez un coup d'oeil à [www.ggplot2-exts.org](https://www.ggplot2-exts.org/) pour d'autres extensions de `ggplot2`. Notez que vous pouvez en apprendre plus sur la conception et la manipulation d'images avec l'atelier QCBS ["Introduction à la conception graphique et à la manipulation d'images avec des outils open source"](https://wiki.qcbs.ca/graphics). --- class: inverse, center, bottom # Merci d'avoir participé ! ![:scale 50%](images/QCBS_logo.png)