---
title: "Représentation graphique de jeu de données en langage R"
author: "Rémy Villette"
date: "22 Octobre 2021"
output:
  xaringan::moon_reader:
    css: xaringan-themer.css
    lib_dir: libs
    nature:
      highlightStyle: github
      countIncrementalSlides: false
      ratio: 16:9
      fig.width: 10
      fig.height: 7
     


---

```{r  include=FALSE, warning=FALSE}
library(tidyverse)
library(lattice)
library(DT)
library(ggpubr)
library(xaringanthemer)
theme_set(theme_classic())
```



# 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[
```{r , out.width="400px", out.height="500px",echo=F}
knitr::include_graphics("./image/pnas.jpg")
```
]
.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[

```{r , echo=F, eval=T, out.width="500px", out.height="400px"}
knitr::include_graphics("./image/Layout profil total.jpg", dpi = 300)
```
]
.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[
```{r , out.width="400px", out.height="500px", echo=F}
knitr::include_graphics("./image/moreno.jpg")
```
]
.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[

```{r , echo=F, out.width="500px"}
knitr::include_graphics("./image/pca heatmap.png")
```
]

---
# 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 ,echo=T}
csv= read.csv("Acides_biliaires_feces_practice_R.csv", sep = ",")
```

```{r , figures-side, fig.show="hold", out.width="50%", out.height="50%", fig.height=4}
plot(1:10)
plot(1:10, type="l")
barplot(1:10)
boxplot(TUDCA~Treatment, data=csv, col=c("red","black","orange"))
```
]

---
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 , fig.align="center", fig.height=4, fig.width=5, message=FALSE, , warning=F}
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")
```
]

---
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 , warning=F, fig.align="center", message=F, fig.align="center", fig.height=4, fig.width=7}
densityplot(~len, data = ToothGrowth, group = supp, auto.key = TRUE)
```

]

.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 , warning=F, fig.align="center", message=F, fig.height=4, fig.width=7}
ggplot(ToothGrowth, aes(x=len, color=supp))+geom_density(stat="density")+
  geom_point(aes(y=0))+
  theme_bw()
```
  ]
  
---
class: middle
```{r eval=F, include=T}
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 ,eval=F, include=T}

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[
```{r ,echo=F, fig.height=5, fig.width=5}
knitr::kable(readxl::read_xlsx("/home/remy/Documents/Vidéo R/ggplot functions.xlsx"))
```

]

---
class: middle
Il existe de nombreux types de graphiques possibles, les plus utilisés sont les suivants :

```{r ,fig.align="center", message=FALSE, warning=F, eval=F, include=T}
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()
```

```{r ,echo=FALSE, message=F, warning=F, out.height="70%", out.width="70%"}
 # p= ggpubr::ggarrange(p1, p2, p3, p4, p5, p6, p7, p8, ncol=4, nrow=2, legend = "none" )
  # ggsave(plot= p, "./image/multiple plot.png", width = 10, height = 5, dpi = 600 )
knitr::include_graphics("./image/multiple plot.png")
```

---
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 ,fig.align="center", message=FALSE, warning=F}
p2= ggplot(data = iris, aes(x = Species, y= Sepal.Length, fill=Species))+ 
  geom_boxplot()+
  geom_violin()+ 
  geom_jitter()
```

``` {r ,echo=F, fig.align="center"}
 # ggsave(plot= p2, "./image/stack plot.png", width = 20, height = 10, dpi = 600 )
knitr::include_graphics("./image/stack plot.png")
```
]

---
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 , echo=F}
cereal= read.csv("/home/remy/Documents/Vidéo R/cereal.csv")
```
## Réponse 1
``` {r}
p3= ggplot(data=cereal, aes(x= manufacturer, y= calories, color=manufacturer))+ 
  geom_violin()+ 
  geom_boxplot(width=0.1)+
  geom_jitter()
```

```{r echo=F, warning=F, fig.align="center", out.height="50%", out.width="50%"}
  # ggsave(plot= p3, "./image/réponse 1.png", width = 7, height = 5, dpi = 600 ) 
knitr::include_graphics("./image/réponse 1.png")
```

---
## Réponse 2
```{r , warning=F, message=F, }
p4= ggplot(data=cereal, aes(x= manufacturer, y= sugars/fiber, color=manufacturer))+ 
  geom_violin()+ 
  geom_boxplot(width=0.1)+
  geom_jitter()
```

```{r echo=F,fig.align="center", out.height="50%", out.width="50%"}
 # ggsave(plot= p4, "./image/réponse 2.png", width = 7, height = 5, dpi = 600 )
knitr::include_graphics("./image/réponse 2.png")
```

---
## Réponse 3
```{r , warning=F, message=F}
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
```

```{r ,echo=F, fig.align="center",  out.height="50%", out.width="50%"}
# ggsave(plot= p5, "./image/réponse 3.png", width = 7, height = 5, dpi = 600 )
knitr::include_graphics("./image/réponse 3.png")
```

---
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 , warning=F, fig.align="center", message=F}
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))
```

```{r echo=F, fig.align="center",  out.height="50%", out.width="50%"}
 # ggsave(plot= p6, "./image/ratio.png", width = 7, height = 5, dpi = 600 )
knitr::include_graphics("./image/ratio.png")
```

---

# 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 , warning=F, fig.align="center", message=F}
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))

```

```{r echo=F, fig.align="center", message=F,  out.height="50%", out.width="50%"}
 # ggsave(plot= p7, "./image/ratio2.png", width = 7, height = 5, dpi = 600 )
knitr::include_graphics("./image/ratio2.png")
```

---

# 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.
```{r , warning=F, message=F, echo=F, fig.align="center", out.height="50%", out.width="50%"}
# datatable(cereal, extensions = 'FixedColumns',
#   options = list(
#     dom = 't',
#     scrollX = TRUE,
#     fixedColumns = TRUE
#   ))
knitr:: kable(cereal)
```

---
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 , warning=F, fig.align="center"}
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)
```
```{r , warning=F, fig.align="center", echo=F}
datatable(cereal_long)
```

---
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 eval=F, echo=T, include=T}
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()

```


```{r fig.align="center",  message=FALSE, warning=F, echo=F,  out.height="50%", out.width="70%"}
p8 =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()+
  facet_wrap(~factor, scales = "free")+
  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"
))+scale_fill_manual(values= c("bisque", "thistle", "snow3", "burlywood4", "lightblue2", 
                               "salmon", "palegoldenrod"
))+theme_classic()+
theme(legend.position = "bottom", axis.text.x = element_blank())
ggsave(plot= p8, "./image/long plot.png", width = 15, height = 10, dpi = 600 )
knitr::include_graphics("./image/long plot.png")
```


---

# Exemple sur le dataset *cereal* (6)

```{r eval=T, include=T}
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))
```

``` {r fig.align="center",  out.height="50%", out.width="70%", message=FALSE, warning=F, echo=F, eval=T}
ggsave(plot= p9, "./image/long plot2.png", width = 10, height = 7, dpi = 600 )
knitr::include_graphics("./image/long plot2.png")
```

---
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[

```{r  fig.align="center", out.width="800px", out.height="500px", echo=F}
knitr::include_graphics("./image/heatmap top20 exhes france.png")
```
]
.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[
```{r fig.align="center", out.width="1000px", out.height="500px", message=FALSE, echo=F, warning=F}
knitr::include_graphics("./image/scheme heatmap.png")
```
]
.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 , fig.align='center', fig.width=5, fig.height=5}
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
```

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 , warning=F, fig.align="center",  message=F}
p10 = ggplot(cereal_long, aes(factor, manufacturer, fill=value))+
  geom_tile()
```

]

.pull-right[

```{r , warning=F, fig.align="center", message=F}
p11 = ggplot(cereal_long, aes(factor, name, fill=value))+
  geom_tile()+theme(legend.position = "none")
```
]

``` {r fig.align="center", message=FALSE, warning=F, echo=F, eval=T}
ggsave(plot= ggarrange(p10, p11), "./image/heatmap ggplot.png", width = 15, height = 5, dpi = 600 )
knitr::include_graphics("./image/heatmap ggplot.png")
```

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 , warning=F, fig.align="center",message=F, eval=F, out.height="70%", out.width="70%"}
library(heatmaply)
p12= ggheatmap(as.matrix(t(cereal[,4:16])), labCol = cereal$manufacturer,  hclustfun = function(x)hclust(dist(x),"ward.D2"), Rowv=F)
```

``` {r fig.align="center", out.height="70%", out.width="70%", message=FALSE, warning=F, echo=F, eval=T}
# ggsave(plot= p12, "./image/ggheatmap.png", width = 15, height = 10, dpi = 600 )
knitr::include_graphics("./image/ggheatmap.png")
```

---

# 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 , warning=F, fig.align="center", message=F}
heatmap(as.matrix(t(cereal[,4:16])),  
        labCol = cereal$manufacturer, Rowv = NA, 
        scale = "none", 
        hclustfun = function(x)hclust(dist(x),"ward.D2"))
```

.pull-right[
```{r, echo=F,  out.width="50%", out.height="50%", eval=F}
png("./image/heatmap simple.png", width=700, height = 500)
heatmap(as.matrix(t(cereal[,4:16])),  labCol = cereal$manufacturer, Rowv = NA, scale = "none", hclustfun = function(x)hclust(dist(x),"ward.D2"))
whatever <- dev.off()
knitr::include_graphics("./image/heatmap simple.png")
```

]

---
# 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 message=F, warning=F}
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 !

---

```{r , echo=F, out.width="80%", out.height="50%", message=F, warning=F, fig.align="center"}
png("./image/heatmap complex.png", width=700, height = 500)
side+h1
whatever <- dev.off()
knitr:: include_graphics("./image/heatmap complex.png")
```

---
# 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 message=F, warning=F, eval=T}
# 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

``` {r fig.align="center", message=FALSE, warning=F, echo=F, eval=T, out.height="70%", out.width="70%"}
 p14= ggpubr::ggarrange(p2+p13)

 ggsave(plot= p14, "./image/stat.png", width = 15, height = 7, dpi = 600 )
knitr::include_graphics("./image/stat.png")
```

