---
title: "Graphes"
author: "Maxime Wack"
date: "19/11/2019"
output:
  xaringan::moon_reader:
    css: ['default','css/my_style.css']
    lib_dir: libs
    seal: false
    nature:
      ratio: '4:3'
      countIncrementalSlides: false
      self-contained: true
      beforeInit: "addons/macros.js"
      highlightLines: true
  pdf_document:
    seal: false
---

```{r setup, include=FALSE}
library(tidyverse)
library(DT)
library(knitr)

opts_chunk$set(echo = TRUE,
               ## fig.asp= .5,
               message = F,
               warning = F)

options(DT.options = list(paging = F,
                          search = F,
                          info = F))

datatable <- partial(datatable, rownames = F)
```

class: center, middle, title

# UE Visualisation

### 2019-2020

## Dr. Maxime Wack

### AHU Informatique médicale
#### Hôpital Européen Georges Pompidou, </br> Université de Paris

---
# Graphe bipartite

.pull-left[
### Graphe contenant deux sets de sommets **complèment déconnectés**
### Dit aussi 2-coloriable
]

.pull-right[
![](06_img/bipartite.png)
]

---
# Projection

.pull-left[
### Méthode permettant de créer **deux** graphes
### Les sommets d'une partie sont connectés s'ils partagent un sommet d'une autre partie
]

.pull-right[
![](06_img/71.png)
]

---
# Projection

.pull-left[
### Méthode permettant de créer **deux** graphes
### Les sommets d'une partie sont connectés s'ils partagent un sommet d'une autre partie
]

.pull-right[
![](06_img/72.png)
]

---
# Projection

.pull-left[
### Méthode permettant de créer **deux** graphes
### Les sommets d'une partie sont connectés s'ils partagent un sommet d'une autre partie
]

.pull-right[
![](06_img/73.png)
]

---
# Projection

.pull-left[
### Méthode permettant de créer **deux** graphes
### Les sommets d'une partie sont connectés s'ils partagent un sommet d'une autre partie
]

.pull-right[
![](06_img/74.png)
]

---
# Projection

.pull-left[
### Méthode permettant de créer **deux** graphes
### Les sommets d'une partie sont connectés s'ils partagent un sommet d'une autre partie
]

.pull-right[
![](06_img/75.png)
]

---
# Projection

.pull-left[
### Méthode permettant de créer **deux** graphes
### Les sommets d'une partie sont connectés s'ils partagent un sommet d'une autre partie
]

.pull-right[
![](06_img/76.png)
]

---
# Projection

.pull-left[
### Méthode permettant de créer **deux** graphes
### Les sommets d'une partie sont connectés s'ils partagent un sommet d'une autre partie
]

.pull-right[
![](06_img/77.png)
]

---
class:center
# Projection

.pull-right[
![](06_img/bipartite.png)
]

---
class:center
# Projection

.pull-left[
![](06_img/numbered_.png)
]

.pull-right[
![](06_img/bipartite.png)
]

---
class:center
# Projection

.pull-c1[
![](06_img/numbered_.png)
]

.pull-c2[
![:scale 75%](06_img/bipartite.png)
]

--
.pull-c3[
![:scale 65%](06_img/projection.png)
]

---

# OMIM

*Online Mendelian Inheritance in Men*

Base de données d'associations connues gène ↔ phénotype

https://omim.org

https://maximewack.com/files/OMIM.csv

---
class: center
# The Human Disease Network

https://www.ncbi.nlm.nih.gov/pubmed/17502601

![:scale 90%](06_img/HDN_principe.png)

---
class: center
# The Human Disease Network

https://www.ncbi.nlm.nih.gov/pubmed/17502601

![:scale 90%](06_img/HDN.png)

---
# Librairies

```{r libs}
library(igraph)
library(ggraph)
library(tidyverse)
```

---
class:center,middle
# igraph

---

# Créer des graphes

```{r create graph, eval = F}
# Graphe sans arête
graph.empty(n = 10, directed = T)

# Graphe complètement connecté
graph.full(n = 10, directed = F, loops = F)

# Graphe en étoile
graph.star(n = 10, mode = "out")
```

---
# Chargement du graphe


```{r load}
read_csv("lab06_data/OMIM.csv") -> OMIM
```

```{r load show, echo = F}
OMIM %>%
  slice(70:80) %>%
  datatable
```

---
# Chargement du graphe

```{r graph data frame}
graph.data.frame(OMIM, directed = F) -> graphe
```

```{r graph data frame show, echo = F}
graphe
```
---
# Informations sur le graphe

### Sommets

```{r vcount}
vcount(graphe)
```
### Arêtes

```{r ecount}
ecount(graphe)
```

---
# Informations sur le graphe

### Dirigé ?

```{r directed}
is.directed(graphe)
```

### Voisins d'un sommet

```{r neighbors}
neighbors(graphe, V(graphe)[2019])
```

---
# Projection

```{r projection}
# Établir les types (gène, phénotype)
V(graphe)$type <- bipartite.mapping(graphe)$type

# Créer les projections
projs <- bipartite.projection(graphe)

# Séparer les projections en deux graphes
HDN <- projs$proj1
HGN <- projs$proj2
```
---

# HDN

```{r HDN}
HDN
```
---

# HGN

```{r HGN}
HGN
```
---

# Décomposition en sous-graphes

```{r decompos}
HDN %>%
  decompose -> diseases
```
---

# ggraph

```{r visu}
graph_one <- function(graph)
{
  ggraph(graph) +
    geom_edge_diagonal() +
    geom_node_label(aes(label = name))
}
```

---

# Filtrer sous-graphes < 10 sommets

```{r sous-graphes par sommets}
diseases %>%
  keep(map_dbl(diseases, vcount) >= 10) %>%
  map(graph_one) -> plots
```
---

# Malformations cardiaques

```{r cardiaques}
plots[[5]]
```
---
# Surdités

```{r surdités}
plots[[9]]
```
---
# Ostéogénèses imparfaites

```{r Ostéogénèses}
plots[[12]]
```
---

# Export

```{r export, eval = F}
write.graph(HDN, file = "diseases.graphml", format = "graphml")
write.graph(HGN, file = "genes.graphml", format = "graphml")
```
