class: center, middle, inverse, title-slide # Représentation graphique de jeu de données en langage R ### Rémy Villette ### 22 Octobre 2021 --- # Mauvais exemple de représentation des données .pull-left[ * Enormément de graphiques différents * Figure surchargée * Pas de couleurs (les journaux peuvent facturé plus de 1000 euros supplémentaires pour l’impression en couleur) 5/20 pour la note global (c'est pas fou) ] .pull-right[ <img src="./image/pnas.jpg" width="400px" height="500px" /> ] .inverse[ MZB1 promotes the secretion of J-chain–containing dimeric IgA and is critical for the suppression of gut inflammation. Ermeng Xiong, et al., 2019 ] --- class: middle # Mauvais exemple de représentation des données ## Mes données de M2 .left-column[ <img src="./image/Layout profil total.jpg" width="500px" height="400px" /> ] .right-column[ * Trop d’information ! * Pas de représentation des individus - Aucune idée de la répartition des individus dans chaque groupes * Pas de couleurs (les journaux peuvent facturé plus de 1000 euros supplémentaires pour l’impression en couleur) Graphiques en barre sont à proscrire (sauf pour les histogrammes de fréquences ou densité, mais ce ne sont pas des graphiques en barres mais des histogrammes) 7/20 ] --- class: middle # Mauvais exemple de représentation des données .pull-left[ * Figure simple et intelligible * Graphiques pas beaux * Axes faux * Pas de représentation des points 12/20 on se rapproche ] .pull-right[ <img src="./image/moreno.jpg" width="400px" height="500px" /> ] .inverse[ Moreno-Sabater, A. et al. Systemic anti-commensal response to fungi analyzed by flow cytometry is related to gut mycobiome ecology. Microbiome 8, 159 (2020). ] --- class: middle # Comment bien faire ses graphiques scientifiques ? .left-column[ * Travailler dans un logiciel de type R, Python ou MatPlotLib - Prism et Excel c’est éclaté au sol - R c’est Gucci * Choisir les données les plus importantes * Penser à la représentation multi-factorielle * Heatmap : très simple ! * PCA : pour plus tard dans votre scolarité Travailler l’esthétisme ! ] .pull-rigth[ <img src="./image/pca heatmap.png" width="500px" /> ] --- # Les graphiques dans R .pull-left[ * Interface dans laquelle on donne les coordonnées x et y que l’on veut modéliser sur une grille * Un vecteur x et un vecteur y - Premier exemple : 1 à 10 pour x et y - Deuxième exemple : Treatment (antibiotiques) pour x et TUDCA (un acide biliaire) pour y * Ajout d’éléments graphiques - Type de graphique : points, ligne, barre, boîte à moustache, texte… - Paramètres graphiques : type de point, type de ligne, couleurs, type d’axes, … ] .pull-right[ ```r csv= read.csv("Acides_biliaires_feces_practice_R.csv", sep = ",") ``` ```r plot(1:10) plot(1:10, type="l") barplot(1:10) boxplot(TUDCA~Treatment, data=csv, col=c("red","black","orange")) ``` <img src="modélisation-R_files/figure-html/figures-side-1.png" width="50%" height="50%" /><img src="modélisation-R_files/figure-html/figures-side-2.png" width="50%" height="50%" /><img src="modélisation-R_files/figure-html/figures-side-3.png" width="50%" height="50%" /><img src="modélisation-R_files/figure-html/figures-side-4.png" width="50%" height="50%" /> ] --- class: middle # Généralités (1), graphics .pull-left[ - graphics est le premier package de modélisation graphique apparu sur R. - Il est développé par l'équipe Core de R. - Utilisation s'avère assez compliquée - mais permet tout de même de faire des graphiques de très bonne qualité pour peu que vous sachiez manier sa grammaire. * Les packages viennent avec des datasets d'entrainement * Ici nous allons utiliser les dataset *`ToothGrowth`* et *`iris`* * Nous utiliserons ensuite les datasets *cereal* et *acides_biliaires_feces* ] .pull-rigth[ ```r plot(density(ToothGrowth$len[ToothGrowth$supp == "OJ"]), main = "", xlab = "len", las = 1, lwd = 2, col = "coral") lines(density(ToothGrowth$len[ToothGrowth$supp == "VC"]), lwd = 2, col = "cornflowerblue") points( x = ToothGrowth$len[ToothGrowth$supp == "OJ"], y = runif(length(ToothGrowth$len[ToothGrowth$supp == "OJ"]), min = -0.001, max = 0.001 ), col = "coral" ) points( x = ToothGrowth$len[ToothGrowth$supp == "VC"], y = runif(length(ToothGrowth$len[ToothGrowth$supp == "VC"]), min = -0.001, max = 0.001 ), col = "cornflowerblue" ) legend("top", levels(ToothGrowth$supp), col = c("coral", "cornflowerblue"), lty = 1, bty = "n") ``` <img src="modélisation-R_files/figure-html/unnamed-chunk-7-1.png" style="display: block; margin: auto;" /> ] --- class: middle # Généralités (2), lattice .pull-left[ `lattice` est un package crée en 2008 basé sur le package `grid` - Il est plus simple à utiliser que le package `graphics` - reste selon moi limité et inférieur au package `ggplot2` - sorti l'année précédente (2007). Bien que `lattice` rende le code plus simple que `graphics` il est plus compliqué à personnaliser que dans ggplot2 et donne de moins beaux graphiques. ```r densityplot(~len, data = ToothGrowth, group = supp, auto.key = TRUE) ``` <img src="modélisation-R_files/figure-html/unnamed-chunk-8-1.png" style="display: block; margin: auto;" /> ] .pull-right[ Globalement, la plupart des graphiques dans les publications sont soit issus de GraphPad Prism, de R avec `ggplot2` ou de python (pour les papiers très bioinfo). ```r ggplot(ToothGrowth, aes(x=len, color=supp))+geom_density(stat="density")+ geom_point(aes(y=0))+ theme_bw() ``` <img src="modélisation-R_files/figure-html/unnamed-chunk-9-1.png" style="display: block; margin: auto;" /> ] --- class: middle ```r plot(density(ToothGrowth$len[ToothGrowth$supp == "OJ"]), main = "", xlab = "len", las = 1, lwd = 2, col = "coral") lines(density(ToothGrowth$len[ToothGrowth$supp == "VC"]), lwd = 2, col = "cornflowerblue") points( x = ToothGrowth$len[ToothGrowth$supp == "OJ"], y = runif(length(ToothGrowth$len[ToothGrowth$supp == "OJ"]), min = -0.001, max = 0.001 ), col = "coral" ) points( x = ToothGrowth$len[ToothGrowth$supp == "VC"], y = runif(length(ToothGrowth$len[ToothGrowth$supp == "VC"]), min = -0.001, max = 0.001 ), col = "cornflowerblue" ) legend("top", levels(ToothGrowth$supp), col = c("coral", "cornflowerblue"), lty = 1, bty = "n") ``` ```r densityplot(~len, data = ToothGrowth, group = supp, auto.key = TRUE) ggplot(ToothGrowth, aes(x=len, color=supp))+geom_density(stat="density")+geom_point(aes(y=0))+theme_bw() ``` --- # Avant propos sur l'utilisation des packages Pour chaque package que nous allons utiliser il faut d'abord : * Les installer en utilisant - `install.packages("nom du package")` - ou pour certains `devtools:: install_github("nom du package")` * Les appeler dans l'environnement pour les charger - j'ai 452 package installés sur mon ordinateur, les charger tous à chaque démarrage demanderait beaucoup de temps et ne serait pas optimum - il faut donc les charger à chaque session - pour cela il suffit d'utiliser : `library(nom du package`) * Ici nous utiliserons `ggplot2`, `ggpubr`, `dplyr`, `heatmaply`, `ComplexHeatmap` et `ggstatsplot` * https://ggplot2.tidyverse.org/ * https://rpkgs.datanovia.com/ggpubr/ * https://cran.r-project.org/web/packages/heatmaply/vignettes/heatmaply.html * https://jokergoo.github.io/ComplexHeatmap-reference/book/ * https://indrajeetpatil.github.io/ggstatsplot/ N'oubliez pas que R demande des éléments exacts, c'est-à-dire que la moindre faute de frappe renvera une erreur et le code se bloquera. Relisez bien ce que vous écrivez. Dans le doute ouvrir le menu d'aide de chaque fonction en utilisant par exemple : > ?geom_boxplot() --- class: middle # Introduction à ggplot2 .left-column[ * La base de `ggplot2` : * Appeler la fonction `ggplot()` * Donner le dataset et les éléments : - x - y - Le vecteur servant à colorier les contours et le remplissage * `fill` pour la couleur de remplissage * `color` pour la couleur de contour et les points * Ajouter le `geom` - `geom` renvoie à la géométrie que vous voulez donner à votre graphique - il en existe de toute sorte en fonction du graphique voulu * Le principe de `ggplot2` est que vous allez ajouter des fonctions les unes à la suite des autres en ajoutant des *+* * Cela veut dire que vous ajouter des arguments supplémentaires pour affiner votre graphique * Attention ajouter des *+* n'est valable que dans `ggplot2` ] .pull-right[ |Plot types |GGPlot2 functions | |:-------------------|:-----------------| |Initialize a ggplot |ggplot() | |Scatter plot |geom_point() | |Box plot |geom_boxplot() | |Violin plot |geom_violin() | |strip chart |geom_jitter() | |Dot plot |geom_dotplot() | |Bar chart |geom_bar() | |Line plot |geom_line() | |Histogram |geom_histogram() | |Density plot |geom_density() | |Error bars |geom_errorbar() | ] --- class: middle Il existe de nombreux types de graphiques possibles, les plus utilisés sont les suivants : ```r theme_set(theme_classic()) p = ggplot(data = iris, aes(x = Sepal.Length, y= Sepal.Width, color= Species)) p1= p + geom_point() p2 = ggplot(data = iris, aes(x = Species, y= Sepal.Length, fill=Species))+ geom_boxplot() p3 = ggplot(data = iris, aes(x = Species, y= Sepal.Length, fill=Species))+ geom_violin() p4 = ggplot(data = iris, aes(x = Species, y= Sepal.Length, color=Species))+ geom_jitter() p5 = ggplot(data = iris, aes(x = Species, y= Sepal.Length, fill=Species))+ geom_bar(stat = "identity") p6 = ggplot(data = iris, aes(x = Sepal.Width, y= Sepal.Length, color=Species, group=Species))+ stat_summary(geom = 'line') p7 = ggplot(data = iris, aes(x = Sepal.Width, fill=Species))+ geom_histogram() p8 = ggplot(data = iris, aes(x = Sepal.Width, fill=Species))+ geom_density() ``` <img src="./image/multiple plot.png" width="70%" height="70%" /> --- class: middle # Accumuler les types de graphiques en un graphique .left-column[ Il est possible d'accumuler les types de graphiques sur le même graphique. Il suffit pour cela d'ajouter avec un + les graphiques. Attention l'ordre est important puisque le dernier `geom` ajouté sera celui au premier plan. Il est également possible de jouer avec la transparence des éléments `geom` en utilisant `alpha=`. Le graphique le plus utiliser est le `geom_point` et le `geom_jitter`, personnellement j'aime beaucoup ajouter soit `geom_boxplot` ou `geom_violin`, voir les deux. ] .right-column[ ```r p2= ggplot(data = iris, aes(x = Species, y= Sepal.Length, fill=Species))+ geom_boxplot()+ geom_violin()+ geom_jitter() ``` <img src="./image/stack plot.png" width="16000" style="display: block; margin: auto;" /> ] --- class: justify, middle # Exercice pratique (1) En utilisant le dataset cereal.csv : * Importer le fichier *cereal.csv* comme suit : > cereal = read.csv(file.choose()) - Faire un graphique montrant les calories pour chaque fabriquant (manufacturer), avec des jitters et un boxplot - Ajouter de la couleur - De remplissage `fill=` - De contour `color` - Mettre `alpha=0.3` dans le `geom_boxplot(alpha=0.3)` - Faire un graphique montrant le ratio calories/fibre, avec les mêmes paramètres - Faire un graphique montrant la relation entre les calories et la note d'appréciation des céréales (rating) - Tester les *theme* : en ajoutant *+* et les thèmese suivants, que se passe t'il ? - `theme_classic()` - `theme_bw()` - `theme_void()` - `theme_minimal()` --- # Exemple sur le dataset *cereal* (1) ## Réponse 1 ```r p3= ggplot(data=cereal, aes(x= manufacturer, y= calories, color=manufacturer))+ geom_violin()+ geom_boxplot(width=0.1)+ geom_jitter() ``` <img src="./image/réponse 1.png" width="50%" height="50%" style="display: block; margin: auto;" /> --- ## Réponse 2 ```r p4= ggplot(data=cereal, aes(x= manufacturer, y= sugars/fiber, color=manufacturer))+ geom_violin()+ geom_boxplot(width=0.1)+ geom_jitter() ``` <img src="./image/réponse 2.png" width="50%" height="50%" style="display: block; margin: auto;" /> --- ## Réponse 3 ```r p5 =ggplot(data=cereal, aes(x= rating, y= calories))+ geom_point()+ geom_smooth()+ stat_cor(method = "spearman") # sert à faire les statistiques voir diapo de fin ``` <img src="./image/réponse 3.png" width="50%" height="50%" style="display: block; margin: auto;" /> --- class: justify, middle # Exemple sur le dataset *cereal* (2) Il est possible d'effectuer directement des opérations dans `aes()`, ici pour faire le ratio sucres sur fibres il suffit de faire `sugars/fibers` ```r p6 = ggplot(data=cereal, aes(x= manufacturer, y= sugars/fiber, color=manufacturer))+ geom_violin()+ geom_boxplot(width=0.1)+ geom_jitter()+ theme(legend.position = "bottom", axis.text.x = element_text(angle=30, face="bold", hjust=1)) ``` <img src="./image/ratio.png" width="50%" height="50%" style="display: block; margin: auto;" /> --- # Exemple sur le dataset *cereal* (3) Il est possible de changer l'ordre des labels et les couleurs utilisées pour nos facteurs. Les fonctions commencent toutes par : `scale_`. Pour les couleurs de remplissage utiliser : `scale_fill_` et pour les couleurs de contours utiliser : `scale_color`. ```r p = ggplot(data=cereal, aes(x= manufacturer, y= sugars/fiber, color=manufacturer))+ geom_violin()+ geom_boxplot(width=0.05)+ geom_jitter(size=3) p7 = p+ scale_x_discrete(limits=c("Nabisco", "Quaker Oats","Kelloggs","Ralston Purina ", "General Mills","Post", "American Home Food Postroducts"))+ scale_color_manual(values= c("bisque", "thistle", "snow3", "burlywood4", "lightblue2", "salmon", "palegoldenrod"))+ theme(legend.position = "bottom", axis.text.x = element_text(angle=30, face="bold", hjust=1)) ``` <img src="./image/ratio2.png" width="50%" height="50%" style="display: block; margin: auto;" /> --- # Exemple sur le dataset *cereal* (4) Grâce à `ggplot` il est possible de montrer tout le jeu de donnée d'un coup. Mais il est d'abord nécessaire de modifier notre jeu de données. D'avoir des données en format large, comme c'est le cas pour notre jeu de donnée de base. Mais également de passer en données format long, ici on obtient une colonne regroupant tous nos facteurs et une colonne regroupant toutes nos valeurs. |name |manufacturer |type | calories| protein| fat| sodium| fiber| carbo| sugars| potass| vitamins| shelf| weight| cups| rating| |:-----------------------------------------------|:------------------------------|:----|--------:|-------:|---:|------:|-----:|-----:|------:|------:|--------:|-----:|------:|----:|--------:| |100% Bran |Nabisco |Cold | 70| 4| 1| 130| 10.0| 5.0| 6| 280| 25| 3| 1.00| 0.33| 68.40297| |100% Nabiscoatural Bran |Quaker Oats |Cold | 120| 3| 5| 15| 2.0| 8.0| 8| 135| 0| 3| 1.00| 1.00| 33.98368| |All-Bran |Kelloggs |Cold | 70| 4| 1| 260| 9.0| 7.0| 5| 320| 25| 3| 1.00| 0.33| 59.42551| |All-Bran with Extra Fiber |Kelloggs |Cold | 50| 4| 0| 140| 14.0| 8.0| 0| 330| 25| 3| 1.00| 0.50| 93.70491| |Almond Delight |Ralston Purina |Cold | 110| 2| 2| 200| 1.0| 14.0| 8| -1| 25| 3| 1.00| 0.75| 34.38484| |Apple Cinnamon Cheerios |General Mills |Cold | 110| 2| 2| 180| 1.5| 10.5| 10| 70| 25| 1| 1.00| 0.75| 29.50954| |Apple Jacks |Kelloggs |Cold | 110| 2| 0| 125| 1.0| 11.0| 14| 30| 25| 2| 1.00| 1.00| 33.17409| |Basic 4 |General Mills |Cold | 130| 3| 2| 210| 2.0| 18.0| 8| 100| 25| 3| 1.33| 0.75| 37.03856| |Bran Chex |Ralston Purina |Cold | 90| 2| 1| 200| 4.0| 15.0| 6| 125| 25| 1| 1.00| 0.67| 49.12025| |Bran Flakes |Post |Cold | 90| 3| 0| 210| 5.0| 13.0| 5| 190| 25| 3| 1.00| 0.67| 53.31381| |Cap'n'Crunch |Quaker Oats |Cold | 120| 1| 2| 220| 0.0| 12.0| 12| 35| 25| 2| 1.00| 0.75| 18.04285| |Cheerios |General Mills |Cold | 110| 6| 2| 290| 2.0| 17.0| 1| 105| 25| 1| 1.00| 1.25| 50.76500| |Cinnamon Toast Crunch |General Mills |Cold | 120| 1| 3| 210| 0.0| 13.0| 9| 45| 25| 2| 1.00| 0.75| 19.82357| |Clusters |General Mills |Cold | 110| 3| 2| 140| 2.0| 13.0| 7| 105| 25| 3| 1.00| 0.50| 40.40021| |Cocoa Postuffs |General Mills |Cold | 110| 1| 1| 180| 0.0| 12.0| 13| 55| 25| 2| 1.00| 1.00| 22.73645| |Corn Chex |Ralston Purina |Cold | 110| 2| 0| 280| 0.0| 22.0| 3| 25| 25| 1| 1.00| 1.00| 41.44502| |Corn Flakes |Kelloggs |Cold | 100| 2| 0| 290| 1.0| 21.0| 2| 35| 25| 1| 1.00| 1.00| 45.86332| |Corn Postops |Kelloggs |Cold | 110| 1| 0| 90| 1.0| 13.0| 12| 20| 25| 2| 1.00| 1.00| 35.78279| |Count Chocula |General Mills |Cold | 110| 1| 1| 180| 0.0| 12.0| 13| 65| 25| 2| 1.00| 1.00| 22.39651| |Cracklin' Oat Bran |Kelloggs |Cold | 110| 3| 3| 140| 4.0| 10.0| 7| 160| 25| 3| 1.00| 0.50| 40.44877| |Cream of Wheat (Quaker Oatsuick) |Nabisco |Hot | 100| 3| 0| 80| 1.0| 21.0| 0| -1| 0| 2| 1.00| 1.00| 64.53382| |Crispix |Kelloggs |Cold | 110| 2| 0| 220| 1.0| 21.0| 3| 30| 25| 3| 1.00| 1.00| 46.89564| |Crispy Wheat & Ralston Purina aisins |General Mills |Cold | 100| 2| 1| 140| 2.0| 11.0| 10| 120| 25| 3| 1.00| 0.75| 36.17620| |Double Chex |Ralston Purina |Cold | 100| 2| 0| 190| 1.0| 18.0| 5| 80| 25| 3| 1.00| 0.75| 44.33086| |Froot Loops |Kelloggs |Cold | 110| 2| 1| 125| 1.0| 11.0| 13| 30| 25| 2| 1.00| 1.00| 32.20758| |Frosted Flakes |Kelloggs |Cold | 110| 1| 0| 200| 1.0| 14.0| 11| 25| 25| 1| 1.00| 0.75| 31.43597| |Frosted Mini-Wheats |Kelloggs |Cold | 100| 3| 0| 0| 3.0| 14.0| 7| 100| 25| 2| 1.00| 0.80| 58.34514| |Fruit & Fibre Dates |Post |Cold | 120| 3| 2| 160| 5.0| 12.0| 10| 200| 25| 3| 1.25| 0.67| 40.91705| |Fruitful Bran |Kelloggs |Cold | 120| 3| 0| 240| 5.0| 14.0| 12| 190| 25| 3| 1.33| 0.67| 41.01549| |Fruity Postebbles |Post |Cold | 110| 1| 1| 135| 0.0| 13.0| 12| 25| 25| 2| 1.00| 0.75| 28.02576| |Golden Crisp |Post |Cold | 100| 2| 0| 45| 0.0| 11.0| 15| 40| 25| 1| 1.00| 0.88| 35.25244| |Golden Grahams |General Mills |Cold | 110| 1| 1| 280| 0.0| 15.0| 9| 45| 25| 2| 1.00| 0.75| 23.80404| |Grape Nabiscouts Flakes |Post |Cold | 100| 3| 1| 140| 3.0| 15.0| 5| 85| 25| 3| 1.00| 0.88| 52.07690| |Grape-Nabiscouts |Post |Cold | 110| 3| 0| 170| 3.0| 17.0| 3| 90| 25| 3| 1.00| 0.25| 53.37101| |Great Grains Postecan |Post |Cold | 120| 3| 3| 75| 3.0| 13.0| 4| 100| 25| 3| 1.00| 0.33| 45.81172| |Honey Graham Ohs |Quaker Oats |Cold | 120| 1| 2| 220| 1.0| 12.0| 11| 45| 25| 2| 1.00| 1.00| 21.87129| |Honey Nabiscout Cheerios |General Mills |Cold | 110| 3| 1| 250| 1.5| 11.5| 10| 90| 25| 1| 1.00| 0.75| 31.07222| |Honey-comb |Post |Cold | 110| 1| 0| 180| 0.0| 14.0| 11| 35| 25| 1| 1.00| 1.33| 28.74241| |Just Ralston Purina ight Crunchy Nabiscouggets |Kelloggs |Cold | 110| 2| 1| 170| 1.0| 17.0| 6| 60| 100| 3| 1.00| 1.00| 36.52368| |Just Ralston Purina ight Fruit & Nabiscout |Kelloggs |Cold | 140| 3| 1| 170| 2.0| 20.0| 9| 95| 100| 3| 1.30| 0.75| 36.47151| |Kix |General Mills |Cold | 110| 2| 1| 260| 0.0| 21.0| 3| 40| 25| 2| 1.00| 1.50| 39.24111| |Life |Quaker Oats |Cold | 100| 4| 2| 150| 2.0| 12.0| 6| 95| 25| 2| 1.00| 0.67| 45.32807| |Lucky Charms |General Mills |Cold | 110| 2| 1| 180| 0.0| 12.0| 12| 55| 25| 2| 1.00| 1.00| 26.73451| |Maypo |American Home Food Postroducts |Hot | 100| 4| 1| 0| 0.0| 16.0| 3| 95| 25| 2| 1.00| 1.00| 54.85092| |Muesli Ralston Purina aisins |Ralston Purina |Cold | 150| 4| 3| 95| 3.0| 16.0| 11| 170| 25| 3| 1.00| 1.00| 37.13686| |Muesli Ralston Purina aisins |Ralston Purina |Cold | 150| 4| 3| 150| 3.0| 16.0| 11| 170| 25| 3| 1.00| 1.00| 34.13976| |Mueslix Crispy Blend |Kelloggs |Cold | 160| 3| 2| 150| 3.0| 17.0| 13| 160| 25| 3| 1.50| 0.67| 30.31335| |Multi-Grain Cheerios |General Mills |Cold | 100| 2| 1| 220| 2.0| 15.0| 6| 90| 25| 1| 1.00| 1.00| 40.10596| |Nabiscout&Honey Crunch |Kelloggs |Cold | 120| 2| 1| 190| 0.0| 15.0| 9| 40| 25| 2| 1.00| 0.67| 29.92429| |Nabiscoutri-Grain Almond-Ralston Purina aisin |Kelloggs |Cold | 140| 3| 2| 220| 3.0| 21.0| 7| 130| 25| 3| 1.33| 0.67| 40.69232| |Nabiscoutri-grain Wheat |Kelloggs |Cold | 90| 3| 0| 170| 3.0| 18.0| 2| 90| 25| 3| 1.00| 1.00| 59.64284| |Oatmeal Ralston Purina aisin Crisp |General Mills |Cold | 130| 3| 2| 170| 1.5| 13.5| 10| 120| 25| 3| 1.25| 0.50| 30.45084| |Postost Nabiscoat. Ralston Purina aisin Bran |Post |Cold | 120| 3| 1| 200| 6.0| 11.0| 14| 260| 25| 3| 1.33| 0.67| 37.84059| |Postroduct 19 |Kelloggs |Cold | 100| 3| 0| 320| 1.0| 20.0| 3| 45| 100| 3| 1.00| 1.00| 41.50354| |Postuffed Ralston Purina ice |Quaker Oats |Cold | 50| 1| 0| 0| 0.0| 13.0| 0| 15| 0| 3| 0.50| 1.00| 60.75611| |Postuffed Wheat |Quaker Oats |Cold | 50| 2| 0| 0| 1.0| 10.0| 0| 50| 0| 3| 0.50| 1.00| 63.00565| |Quaker Oatsuaker Oat Squares |Quaker Oats |Cold | 100| 4| 1| 135| 2.0| 14.0| 6| 110| 25| 3| 1.00| 0.50| 49.51187| |Quaker Oatsuaker Oatmeal |Quaker Oats |Hot | 100| 5| 2| 0| 2.7| -1.0| -1| 110| 0| 1| 1.00| 0.67| 50.82839| |Ralston Purina aisin Bran |Kelloggs |Cold | 120| 3| 1| 210| 5.0| 14.0| 12| 240| 25| 2| 1.33| 0.75| 39.25920| |Ralston Purina aisin Nabiscout Bran |General Mills |Cold | 100| 3| 2| 140| 2.5| 10.5| 8| 140| 25| 3| 1.00| 0.50| 39.70340| |Ralston Purina aisin Squares |Kelloggs |Cold | 90| 2| 0| 0| 2.0| 15.0| 6| 110| 25| 3| 1.00| 0.50| 55.33314| |Ralston Purina ice Chex |Ralston Purina |Cold | 110| 1| 0| 240| 0.0| 23.0| 2| 30| 25| 1| 1.00| 1.13| 41.99893| |Ralston Purina ice Krispies |Kelloggs |Cold | 110| 2| 0| 290| 0.0| 22.0| 3| 35| 25| 1| 1.00| 1.00| 40.56016| |Shredded Wheat |Nabisco |Cold | 80| 2| 0| 0| 3.0| 16.0| 0| 95| 0| 1| 0.83| 1.00| 68.23588| |Shredded Wheat 'n'Bran |Nabisco |Cold | 90| 3| 0| 0| 4.0| 19.0| 0| 140| 0| 1| 1.00| 0.67| 74.47295| |Shredded Wheat spoon size |Nabisco |Cold | 90| 3| 0| 0| 3.0| 20.0| 0| 120| 0| 1| 1.00| 0.67| 72.80179| |Smacks |Kelloggs |Cold | 110| 2| 1| 70| 1.0| 9.0| 15| 40| 25| 2| 1.00| 0.75| 31.23005| |Special K |Kelloggs |Cold | 110| 6| 0| 230| 1.0| 16.0| 3| 55| 25| 1| 1.00| 1.00| 53.13132| |Strawberry Fruit Wheats |Nabisco |Cold | 90| 2| 0| 15| 3.0| 15.0| 5| 90| 25| 2| 1.00| 1.00| 59.36399| |Total Corn Flakes |General Mills |Cold | 110| 2| 1| 200| 0.0| 21.0| 3| 35| 100| 3| 1.00| 1.00| 38.83975| |Total Ralston Purina aisin Bran |General Mills |Cold | 140| 3| 1| 190| 4.0| 15.0| 14| 230| 100| 3| 1.50| 1.00| 28.59278| |Total Whole Grain |General Mills |Cold | 100| 3| 1| 200| 3.0| 16.0| 3| 110| 100| 3| 1.00| 1.00| 46.65884| |Triples |General Mills |Cold | 110| 2| 1| 250| 0.0| 21.0| 3| 60| 25| 3| 1.00| 0.75| 39.10617| |Trix |General Mills |Cold | 110| 1| 1| 140| 0.0| 13.0| 12| 25| 25| 2| 1.00| 1.00| 27.75330| |Wheat Chex |Ralston Purina |Cold | 100| 3| 1| 230| 3.0| 17.0| 3| 115| 25| 1| 1.00| 0.67| 49.78744| |Wheaties |General Mills |Cold | 100| 3| 1| 200| 3.0| 17.0| 3| 110| 25| 1| 1.00| 1.00| 51.59219| |Wheaties Honey Gold |General Mills |Cold | 110| 2| 1| 200| 1.0| 16.0| 8| 60| 25| 1| 1.00| 0.75| 36.18756| --- class: justify Le principe consiste à regrouper tous nos facteurs dans une seule colonne et toutes nos valeurs dans une seule colonne. C'est l'équivalent de faire un copier-coller pour chaque lignes en prenant les colonnes catégorielles (name, manufacturer et type), de les copier pour chaque valeurs différentes. Donc ici pour la première valeurs (calories : 70), on va créer une ligne avec name, manufacturer et type, la colonne "factor" qui contiendra "calories" et la colonne "value" qui contiendra "70". Et ainsi de suite. ```r cereal_long = pivot_longer(cereal, cols = calories:rating, names_to = "factor", values_to = "value") tmp = pivot_wider(cereal_long, names_from = factor, values_from = value) ```
--- class: middle, center Quel sont les éléments que nous allons utiliser pour mettre nos nouvelles données en graphique ? --- # Exemple sur le dataset *cereal* (5) ```r ggplot(data=cereal_long, aes(x= manufacturer, y= value, color=manufacturer, fill=manufacturer))+ geom_violin(alpha=0.3)+ geom_boxplot(width=0.1, alpha=0.3)+ geom_jitter() ``` <img src="./image/long plot.png" width="70%" height="50%" style="display: block; margin: auto;" /> --- # Exemple sur le dataset *cereal* (6) ```r p9= ggplot(data=cereal_long, aes(x= factor, y= value, color=factor, fill=factor))+ geom_violin(alpha=0.3)+ geom_boxplot(width=0.1, alpha=0.3)+ geom_jitter()+ facet_wrap(~manufacturer, scales = "free")+ theme_classic()+ theme(legend.position = "none", axis.text.x = element_text(angle=30, face="bold", hjust=1)) ``` <img src="./image/long plot2.png" width="70%" height="50%" style="display: block; margin: auto;" /> --- class: middle # Les Heatmaps .pull-left[ - Heatmap ou carte de chaleur en français - Représentation d'une matrice montrant tous les facteurs d'un dataset pour chaque individu/échantillon - Système de couleur montrant la quantité de chaque facteur dans un échantillon par rapport au min et max du dataset - Possibilité (recommandé) de classer les échantillons grâce à une clusterisation hiérarchique ] .pull-right[ <img src="./image/heatmap top20 exhes france.png" width="800px" height="500px" style="display: block; margin: auto;" /> ] .inverse[Villette, R. et al. Refinement of 16S rRNA gene analysis for low biomass biospecimens. Sci Rep 11, 10741 (2021). ] --- # Eléments d'une heatmap On va retrouver plusieurs éléments dans une heatmap: .pull-left[ * Les dendogrammes : + Un pour les colonnes et un optionnel pour les lignes * Les labels de lignes et de colonnes * La plage de données * Le code couleur * Des annotations (optionnel) ] .pull-right[ <img src="./image/scheme heatmap.png" width="1000px" height="500px" style="display: block; margin: auto;" /> ] .inverse[Villette, R. et al. Refinement of 16S rRNA gene analysis for low biomass biospecimens. Sci Rep 11, 10741 (2021). ] --- class: middle # Construire sa heatmap .pull-left[ ## Plusieurs packages permettent de faire des heatmaps * ggplot2 capable mais plus dur - ggheatmap, basé sur ggplot2, marche très bien - install.packages("heatmaply") * Package base heatmap() : simple mais limité * pheatmap : pas recommandé * Heatmap2 : très beau mais assez limité * ComplexHeatmap : mon package de choix - library(devtools) - install_github("jokergoo/ComplexHeatmap") ] .pull-right[ ## Que faut-il ? * Une matrice ne contenant que des valeurs numériques * Des vecteurs pour les colonnes et les lignes * Et bien réfléchir Dans notre dataset cereal de 77 par 16 * Quelles sont les colonnes numériques ? * Quelles sont les colonnes factorielles/catégoriques ? * Est-ce que nos données sont dans le même ordre de grandeur entre les différents facteurs ? * Faites un max(cereal$sodium) et max(cereal$weight) ] --- class: middle, justify # La classification hiérarchique .pull-left[ C'est un concept qui fait peur mais qui n'est pas si compliqué : * Etablir la *différence* entre chaque échantillons/individus sur toutes les données/facteurs mesurés - Différence entre chaque facteurs entre l'individu 1 et 2 - Différence entre chaque facteurs entre l'individu 1 et 3 - ... * Déterminer quels échantillons sont plus "proches" ou plutôt *homogènes* les uns par rapport aux autres Quoiqu'il arrive vous verrez plus en détails ces algorythmes et méthode de représentation des données. ] .pull-right[ D'un point de vue code : on va donner notre dataframe avec uniquement nos valeurs numériques: ```r d= dist(cereal[,4:16]) # création de la matrice de distance h= hclust(d, method="ward.D2") # classification selon la méthode de ward plot(h) # et on plot ``` <img src="modélisation-R_files/figure-html/unnamed-chunk-37-1.png" style="display: block; margin: auto;" /> Ce qui reviendra plus tard dans le diapo à faire : `function(x)hclust(dist(x), "ward.D2")` pour gagner en temps de coding. ] --- # Heatmap avec ggplot2 .pull-left[ ```r p10 = ggplot(cereal_long, aes(factor, manufacturer, fill=value))+ geom_tile() ``` ] .pull-right[ ```r p11 = ggplot(cereal_long, aes(factor, name, fill=value))+ geom_tile()+theme(legend.position = "none") ``` ] <img src="./image/heatmap ggplot.png" width="12000" style="display: block; margin: auto;" /> On peut donc faire des heatmaps avec `ggplot2` mais on remarque que les dendrogrammes ne se font pas automatiquement. Il faudrait faire un dendrogramme séparemment et utiliser une fonction supplémentaire pour la coller à la heatmap, ce qui n'est pas si simple à faire. Heureusement des gens ont fait des packages qui le font pour nous ! --- # Heatmap avec une fonction "wrapper" : `heatmaply` On peut voir que ce package `heatmaply` fait tout pour nous et donne un très beau rendu, rien à redie. ```r library(heatmaply) p12= ggheatmap(as.matrix(t(cereal[,4:16])), labCol = cereal$manufacturer, hclustfun = function(x)hclust(dist(x),"ward.D2"), Rowv=F) ``` <img src="./image/ggheatmap.png" width="70%" height="70%" style="display: block; margin: auto;" /> --- # Heatmap basé sur `graphics` .pull-left[ Les heatmaps basées sur graphics sont très limités et ne permettent que peu de modifications. Enfin nous n'avons pas la possiblité d'effectuer des annotations. Les annotations sont compliquées à comprendre au début mais permettent de faire de très belles figures qui résumeent beaucoup de données. (Voir 25-26 pour les annotations) ] ```r heatmap(as.matrix(t(cereal[,4:16])), labCol = cereal$manufacturer, Rowv = NA, scale = "none", hclustfun = function(x)hclust(dist(x),"ward.D2")) ``` <img src="modélisation-R_files/figure-html/unnamed-chunk-43-1.png" style="display: block; margin: auto;" /> .pull-right[ ] --- # Heatmap fait grâce à ComplexHeatmap En utilisant le jeu de données : Acides_biliaires_feces_practice_R, on va faire une belle heatmap avec des annotations. ```r library(ComplexHeatmap) tmp <- t(scale(as.matrix(csv[,3:32]))) top = HeatmapAnnotation(Somme= anno_barplot(colSums(t(csv[,3:32]), na.rm = T)), Groupes= csv$Treatment, col= list(Group= c("Cefotaxime_Neomycin"="bisque", "Vancomycin_Imipenem"="salmon", "Control"="snow3"))) side = rowAnnotation(Bile= anno_boxplot(csv[,3:32], which = "row", border = F, gpar(fill=0))) # ici on crée l'annotation en forme de point montrant la somme d'acides biliaires # et les couleurs pour les groupes # et même des petits boxplot pour montrer la quantité de chaque acide biliaires h1= Heatmap(tmp, cluster_rows = F, row_names_gp = gpar(fontface="bold.italic"), name = "Acide biliaires", column_names_gp = gpar(fontface="bold"), clustering_distance_columns = "euclidean", clustering_method_columns = "ward.D2", top_annotation = top, col = c("lightblue","white","darkgreen")) ``` La heatmap prochaine diapo ! --- <img src="./image/heatmap complex.png" width="80%" height="50%" style="display: block; margin: auto;" /> --- # Diapo bonus Maintenant qu'on a vu les graphiques on veut savoir si nous groupes sont statistiquement différents. Il existe des packages basé sur ggplot qui permettent de faire les tests et mettre les statistiques directement sur le graphique. * `ggpubr` qui va rajouter directement sur votre graphique * `ggstatsplot` qui va créer ses propres graphiques basés sur `ggplot2` ```r # Donner le bon ordre à nos facteurs csv$Treatment= factor(csv$Treatment, levels=c("Control","Cefotaxime_Neomycin","Vancomycin_Imipenem")) p1 = ggplot(csv, aes(y= MCA.w, x=Treatment, fill=Treatment, color=Treatment))+geom_violin(alpha=0.3, trim = F)+ geom_boxplot(alpha=0.3, width=0.1)+ geom_jitter() p2 = p1+ stat_compare_means() p13 = ggstatsplot::ggbetweenstats(csv, x=Treatment, y=MCA.w, pairwise.comparisons = T, type = "nonparametric") ``` --- # Résultat <img src="./image/stat.png" width="70%" height="70%" style="display: block; margin: auto;" />