Titre incluant un moyen mnémotechnique ;D
Avec ses cercles entrecroisés, on ne présente plus le célèbre diagramme de Venn. Cette représentation est utilisée dans le cas où l'on souhaite représenter le recoupement de données de nombre fini selon plusieurs variables qualitatives. De façon plus simple lorsqu'on a 2 variables qualitatives : combien d'éléments présents dans la catégorie A sont également présents ou non dans la catégorie B
Pourquoi des diagrammes "de Venn" ?
S'il est sûr que ces diagrammes représentant des proportions et leur partage date d'avant 1918, c'est à cette date que Clarence Irving Lewis (philosophe et logicien) utilise le terme de "diagramme de Venn". Il fait en cela référence à John Venn (mathématicien et logicien) qui, en 1880, a écrit un article traitant de la généralisation des "cercles eulériens" [1] de Leonhard Euler (mathématicien et physicien). Pour cela, il modifie quelques règles :
- Les cercles peuvent être remplacés par des courbes fermées simples (ellipses, haricots, etc.)
- Une fois fixée, cette forme doit être la même pour toutes les catégories
- Les zones vides doivent être hachurées
- Les zones pleines doivent êtres symbolisées (remplissage de couleur, signe graphique, etc.)
Si ces diagrammes sont très utiles lorsqu'on a peu de catégories, c'est-à-dire entre 2 et 4, il devient rapidement impossible de les utiliser au-delà selon les règles édictées par Venn. C'est pourquoi en 1989, A.W.F. Edwards supprimera notamment la règle des formes identiques pour toutes les catégories afin de pouvoir aller jusque 6 catégories sur un même diagramme dit "d’Edwards-Venn" [2]. Toutefois, par abus de langage, il est courant de désigner ces 3 types de représentation par "diagramme de Venn" (ce que je ne manquerai pas de faire par la suite).
Cependant, si on peut saluer l'effort d'adaptation, il reste un problème majeur à leur utilisation avec autant de catégories : la lisibilité. En effet, la combinaison de recoupements est telle qu'il devient humainement difficile d’appréhender la totalité de l'information en même temps (surtout quand les formes ne sont pas proportionnelles à la quantité qu'elles représentent. Cela donne lieu à ces diagrammes de Venn (plus ou moins comiques) qu'il faut absolument éviter :
Si certains iront jusqu'à faire de la 3D afin de modéliser toujours plus de catégories, nous nous arrêterons pour notre part ici (vos yeux me remercieront). Mais alors, comment faire lorsqu'on est confronté à plus de 4 catégories et qu'on souhaite tout de même visualiser leur recoupement ?
L'avènement des diagrammes UpSet
En 2014, une équipe dévoile une nouvelle visualisation pour palier ce problème : les diagrammes UpSet [5]. Partant du constat d'une revue récente sur le sujet [6], cette équipe s'est lancé le défi de rendre lisible ces informations à l'aide d'une visualisation en deux parties (dans sa version la plus simple) : une matrice et un barplot.
Afin de faciliter votre compréhension des explications qui vont suivre, usons d'un exemple courant en bioinformatique : les groupes de gènes. Imaginez que vous venez par vos analyses (étude de voie métabolique, co-expression, ANOVA, etc.) d'isoler plusieurs groupes de gènes d’intérêt. Vous souhaitez à présent voir quelle part de gènes se recoupe entre vos différents groupes (clusters).
La matrice (ici en magenta) est chargée de représenter les intersections entre les différents sets considérés. Chaque point coloré correspond au groupe qui est pris en compte. Les lignes les traversant permettent quant à elles d'aider visuellement à la lecture (notre œil ayant la fâcheuse tendance à sauter d'une colonne à l'autre). La publication initiale nous offre même un parallèle entre la symbolique des diagrammes UpSet et des diagrammes de Venn :
Le barplot sert quant à lui à rapporter graphiquement cette information de proportion partagée entre les groupes (qui manquait tant aux diagrammes de Venn). Chaque barre témoigne par sa hauteur du nombre de gènes partagés dans la combinaison de la matrice de même colonne (dans le cas des groupes seuls, il s'agit de la proportion de gènes uniques à ce groupe).
L'avantage de cette représentation, c'est qu'on peut lui rajouter un nombre important d'informations complémentaires. Ainsi il n'est pas rare de voir se rajouter un second bar plot qui indique la taille totale de chacun des sets (ici nos groupes). Mais on peut aller encore plus loin et ce sont évidemment les auteurs des diagrammes UpSet qui en font la meilleure preuve grâce à leur outil en ligne. Vous pouvez ainsi ajouter des informations d’agrégation de certains groupes (exemple : différentes conditions expérimentales) ou encore de distribution des données si celles-ci sont quantitatives.
Présentation du package R UpSetR
Une fois n'est pas coutume, on ne va pas vous laisser repartir sans un petit exemple de code permettant de générer ces magnifiques diagrammes. Si je vous présente aujourd'hui une implémentation en R, sachez que bien d'autres langages ont leur propre package/bibliothèque pour faire de même (python par exemple avec UpSetPlot).
Reprenons notre exemple de tout à l'heure et générons de faux gènes et de faux groupes de ceux-ci :
1 2 3 4 5 6 7 8 |
library(magrittr) fake_gene_names = lapply(1 :2000, function(x) { sample(c(1 :9, LETTERS), 5, replace = TRUE) %>% paste(collapse = "")}) %>% unlist clusters = lapply(sample(40 :300, 5), function(x) sample(fake_gene_names, x)) names(clusters) = paste0("cluster_", 1 :length(clusters)) |
À partir de cette liste de groupes de gènes, on va simplement effectuer une transformation afin d'obtenir une matrice présence/absence à l'aide de reshape2 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
library(UpSetR) library(reshape2) # EDIT 18/02 : il existe en fait une fonction native dans UpSetR qui permet de faire cette opération ! mat_pres_abs = UpSetR::fromList(clusters) # Ancienne méthode avec reshape2 mat_pres_abs = clusters %>% stack() %>% cbind(val = 1) %>% reshape2::acast(values ~ ind, value.var = "val", fill = 0) %>% as.data.frame() upset(mat_pres_abs, nsets = length(clusters), matrix.color = "#DC267F", main.bar.color = "#648FFF", sets.bar.color = "#FE6100") |
Et voici notre diagramme UpSet en quelques lignes de code !
Et sur un cas concret ?
Reprenons ce diagramme de Venn sur le protéome du lait selon le stade de lactation et transformons le en diagramme upset !
- 1ère étape : récupérer les données. Pour cela, téléchargez le dataset n°2 à cette adresse.
- 2ème étape : le job habituel du bioinfo, reformater correctement les données qui ont été formatées
en dépit du bon sensde façon peu adaptée à un traitement ultérieur. Pour cela on va concaténer les protéines présentes par stade de lactation - 3ème étape : le upset diagramme tout en simplicité !
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
library(magrittr) library(UpSetR) library(reshape2) library(data.table) lactation_stages = c("Drying-off", "Colostrum", "Earlylactation", "Peaklactation", "Mid-lactation") data_milk = data.table::fread("lactation_stages_4654_proteins_Delosiere2.tab") %>% .[-1, -1] %>% as.list genes_by_lactation = sapply(lactation_stages, function(lac) { lapply(names(data_milk), function(name) { if (grepl(lac, name)) l = data_milk[[name]] }) %>% unlist %>% unique %>% .[which(. != "")] }, simplify = FALSE,USE.NAMES = TRUE) mat_pres_abs = genes_by_lactation %>% stack() %>% cbind(val = 1) %>% reshape2::acast(values ~ ind, value.var = "val", fill = 0) %>% as.data.frame() upset(mat_pres_abs, nsets = length(clusters), matrix.color = "#DC267F", main.bar.color = "#648FFF", sets.bar.color = "#FE6100") |
On retrouve bien toutes nos informations sur la répartition des protéines et celles en commun (par exemple les 105 si importantes dans la publication) mais avec en plus l'information sur les proportions.
Il est également possible de jouer très facilement sur les échelles afin d'améliorer la visualisation.
1 2 3 |
upset(mat_pres_abs, nsets = length(clusters), matrix.color = "#DC267F", main.bar.color = "#648FFF", sets.bar.color = "#FE6100", scale.sets = "log10", scale.intersections = "log10") |
Comme on peut le voir sur le premier diagramme, on constate plus facilement la répartition des protéines et le déséquilibre présent ainsi que le taux de recoupement.
Conclusion
Les diagrammes de Venn ne sont pas à jeter lorsqu'il s'agit de faire des recoupements de 2 ou 3 catégories, mais idéalement, il faudrait associer une proportionnalité entre taille des formes et contenu.
Les diagrammes UpSet sont quant à eux vos nouveaux amis lorsqu'il s'agira de représenter vos recoupements à votre prochaine présentation/ article !
Enfin, est bon de rappeler qu'il est important de définir le message qu'on souhaite faire passer afin d'adapter la visualisation. Faire un upset pour deux catégories sera ainsi trop complexe, et un diagramme upset aussi complet que celui de la figure 12 sera trop long à analyser pour une diapositive dans une présentation.
Sachez estimer 😉
Références
- [1] J. Venn M.A. (1880) I. On the diagrammatic and mechanical representation of propositions and reasonings, The London, Edinburgh, and Dublin Philosophical Magazine and Journal of Science, 10:59, 1–18, DOI : 10.1080/14786448008626877
- [2] https://www.maa.org/press/periodicals/convergence/cogwheels-of-the-mind-the-story-of-venn-diagrams
- [3] D’Hont, A., Denoeud, F., Aury, J. et al. The banana (Musa acuminata) genome and the evolution of monocotyledonous plants. Nature, 488, 213–217 (2012). https://doi.org/10.1038/nature11241
- [4] Delosière, M., Pires, J., Bernard, L. et al. Milk proteome from in silico data aggregation allows the identification of putative biomarkers of negative energy balance in dairy cows. Sci Rep,9, 9718 (2019). https://doi.org/10.1038/s41598-019–46142‑7
- [5] Lex A, Gehlenborg N, Strobelt H, Vuillemot R, Pfister H. UpSet : Visualization of Intersecting Sets. IEEE Trans Vis Comput Graph. 2014;20(12):1983–1992. https://doi.org/10.1109/TVCG.2014.2346248
- [6] Alsallakh, Bilal, et al. "Visualizing sets and set-typed data : State-of-the-art and future challenges." (2014): 1–21.
Pour aller plus loin
- EDIT 18/02 : La vignette du package, plus complète notamment sur ordonnancement des sets : https://cran.r‑project.org/web/packages/UpSetR/vignettes/basic.usage.html
- Mention honorable : le radial set qui malgré une bonne idée initiale, perd également en lisibilité rapidement. https://publik.tuwien.ac.at/files/PubDat_219617.pdf
- D'autres méthodes de visualisation existantes regroupée en un seul endroit, SetViz : https://www.cvast.tuwien.ac.at/SetViz
Merci aux relecteurs schneu, Norore, CreatorOfMoon, et azerin pour leur temps sur cet article !
Laisser un commentaire