Diagramme de Venn en R : en faire un avec VennDiagram

Tracez des diagrammes de Venn à 2, 3 et 4 ensembles, colorez les cercles, étiquetez les effectifs et enregistrez la figure

Faites un diagramme de Venn en R avec le package VennDiagram. Tracez des diagrammes à deux, trois et quatre ensembles, définissez les couleurs de remplissage et la transparence, renommez les ensembles, affichez les effectifs et enregistrez la figure dans un fichier — avec l’alternative ggplot/ggvenn.

Date de publication

27 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • Tracez un diagramme de Venn en R avec VennDiagramdraw.pairwise.venn() (2 ensembles), draw.triple.venn() (3 ensembles) et venn.diagram() (un nombre quelconque, à partir de listes).
  • venn.diagram() prend une liste nommée de vecteurs et calcule pour vous chaque effectif de chevauchement — aucun calcul manuel.
  • Définissez les couleurs des cercles avec fill, adoucissez-les avec alpha (transparence), et renommez les ensembles avec category.names.
  • Par défaut, venn.diagram() écrit dans un fichier ; passez filename = NULL et grid.draw() pour l’afficher dans R à la place.
  • Vous préférez la grammaire des graphiques ? ggvenn et ggVennDiagram construisent des diagrammes de Venn comme des objets ggplot (alternative présentée dans le texte).

Introduction

Vous avez plusieurs listes de gènes, segments de clientèle ou groupes d’enquête, et vous voulez une seule image qui montre comment ils se chevauchent — ce qui est partagé, ce qui est unique. Cette image, c’est un diagramme de Venn : des cercles qui se chevauchent, un par ensemble, chaque région étiquetée par le nombre d’éléments qui y tombent.

En R, l’outil de référence est le package VennDiagram. Il trace des diagrammes prêts à publier pour 2 à 4 ensembles, calcule pour vous chaque effectif d’intersection, et vous laisse colorer, étiqueter et enregistrer le résultat. Cette leçon en construit un, d’un diagramme à deux ensembles vers un diagramme à quatre ensembles, puis couvre les couleurs, la transparence, les noms d’ensembles, les effectifs et l’enregistrement — et vous oriente vers les alternatives basées sur ggplot à la fin.

Installez-le une fois :

install.packages("VennDiagram")

Les données

Nous utiliserons un petit exemple reproductible : quatre ensembles de « gènes » tirés d’un pool commun de 1000. Les mêmes listes alimentent chaque diagramme ci-dessous. C’est du R de base — pas de tidyverse — et autonome, donc vous pouvez copier n’importe quel bloc et l’exécuter seul.

set.seed(20190708)
genes <- paste0("gene", 1:1000)

set_list <- list(
  A = sample(genes, 300),
  B = sample(genes, 525),
  C = sample(genes, 440),
  D = sample(genes, 350)
)

# Sizes of each set
sapply(set_list, length)
  A   B   C   D 
300 525 440 350 

set_list est une liste nommée de vecteurs de caractères — la forme attendue par VennDiagram. Chaque nom (A, B, C, D) devient un cercle ; les chevauchements sont calculés à partir des éléments partagés.

Un diagramme de Venn à deux ensembles

Pour exactement deux ensembles, draw.pairwise.venn() est la voie la plus directe. Elle prend les deux tailles d’ensembles et la taille de leur intersection, puis trace le diagramme à deux cercles. Nous calculons d’abord les trois nombres en R de base.

library(VennDiagram)

# The three counts: |A|, |B|, |A and B|
n_A   <- length(set_list$A)
n_B   <- length(set_list$B)
n_AB  <- length(intersect(set_list$A, set_list$B))

grid.newpage()
draw.pairwise.venn(
  area1 = n_A, area2 = n_B, cross.area = n_AB,
  category = c("A", "B"),
  fill = c("#3a86d4", "#f4a259"),
  alpha = 0.5, lty = "blank",
  cat.pos = c(-20, 20)
)

A two-set Venn diagram in R with an azure circle labelled A and an orange circle labelled B, the overlapping region showing the shared count.

(polygon[GRID.polygon.1], polygon[GRID.polygon.2], polygon[GRID.polygon.3], polygon[GRID.polygon.4], text[GRID.text.5], text[GRID.text.6], text[GRID.text.7], text[GRID.text.8], text[GRID.text.9]) 

area1/area2 sont les deux tailles d’ensembles, cross.area est le chevauchement, et category nomme les cercles. fill les colore, alpha = 0.5 les rend semi-transparents pour que le chevauchement se lise clairement, et lty = "blank" supprime les contours des cercles pour un rendu plus épuré. Nous appelons d’abord grid.newpage() car VennDiagram dessine sur une page grid.

Un diagramme de Venn à trois ensembles

La fonction venn.diagram() est l’outil général : passez-lui la liste nommée et elle calcule tous les chevauchements elle-même — aucun appel manuel à intersect(). Par défaut elle écrit dans un fichier, donc nous mettons filename = NULL pour récupérer un objet dessinable, puis nous le dessinons sur la page avec grid.draw(). C’est notre figure phare.

library(VennDiagram)
library(grid)

venn_obj <- venn.diagram(
  x = set_list[c("A", "B", "C")],
  filename = NULL,
  fill = c("#3a86d4", "#f4a259", "#5fad56"),
  alpha = 0.5, lty = "blank",
  cex = 1.1,            # size of the count numbers
  cat.cex = 1.2,        # size of the set names
  cat.fontface = "bold"
)

grid.newpage()
grid.draw(venn_obj)

A three-set Venn diagram in R with azure, orange and green circles overlapping, each region labelled with its count.

x = set_list[c("A", "B", "C")] passe les trois premiers ensembles. venn.diagram() renvoie un objet graphique grid ; grid.draw() le rend. cex contrôle les étiquettes d’effectifs, cat.cex et cat.fontface stylisent les noms d’ensembles. Les sept régions que vous voyez — trois « seul », trois « par paire », une « tous les trois » — sont toutes comptées automatiquement.

Un diagramme de Venn à quatre ensembles

Le même appel venn.diagram() gère quatre ensembles ; passez la liste complète. Les diagrammes à quatre ensembles utilisent des ellipses (pas des cercles) pour que chacune des 15 régions ait de la place pour son effectif.

library(VennDiagram)
library(grid)

venn_obj <- venn.diagram(
  x = set_list,
  filename = NULL,
  fill = c("#3a86d4", "#f4a259", "#5fad56", "#d6584f"),
  alpha = 0.5, lty = "blank",
  cex = 0.9,
  cat.cex = 1.1, cat.fontface = "bold"
)

grid.newpage()
grid.draw(venn_obj)

A four-set Venn diagram in R using four overlapping ellipses in azure, orange, green and red, each of the fifteen regions labelled with its count.

Quatre ensembles, c’est le plafond pratique pour un diagramme de Venn lisible — au-delà de quatre, les régions deviennent trop petites et les formes trop contorsionnées pour être étiquetées clairement. Pour cinq ensembles ou plus, un UpSet plot (UpSetR) est l’alternative standard.

Couleurs, transparence et noms d’ensembles

L’apparence du diagramme provient de quelques arguments que vous pouvez combiner sur n’importe lequel des appels ci-dessus :

  • fill — une couleur par ensemble. Utilisez un jeu adapté au daltonisme ; ici azur / orange / vert / rouge.
  • alpha — transparence du remplissage (0 invisible, 1 opaque). 0.5 laisse les chevauchements transparaître.
  • lty — type de ligne du contour ; "blank" supprime les bordures des cercles.
  • category.names (dans venn.diagram()) ou category (dans les fonctions draw.*) — les étiquettes.
  • cat.fontface, cat.cex, cat.dist, cat.pos — stylisent et positionnent les noms d’ensembles.
library(VennDiagram)
library(grid)

venn_obj <- venn.diagram(
  x = set_list[c("A", "B", "C")],
  filename = NULL,
  category.names = c("Stage 1", "Stage 2", "Stage 3"),
  fill = c("#0073C2", "#EFC000", "#868686"),
  alpha = 0.5, lty = "blank",
  # Count numbers
  cex = 1, fontface = "italic",
  # Set names, pushed outside the circles
  cat.cex = 1.1, cat.fontface = "bold",
  cat.default.pos = "outer",
  cat.dist = c(0.06, 0.06, 0.04)
)

grid.newpage()
grid.draw(venn_obj)

A three-set Venn diagram with renamed sets Stage 1, Stage 2 and Stage 3, muted journal-style fills, italic counts and bold outer set names.

category.names renomme les ensembles, fontface = "italic" stylise les effectifs, et cat.default.pos = "outer" avec cat.dist pousse les étiquettes d’ensembles hors des cercles pour qu’elles n’entrent pas en collision avec les effectifs.

Obtenir les effectifs de chevauchement

Parfois vous voulez les nombres, pas seulement l’image — quels éléments sont partagés, et combien. Le R de base vous donne les deux avec intersect() et Reduce() :

# Pairwise overlap
length(intersect(set_list$A, set_list$B))
[1] 151
# Items common to all three sets
common_ABC <- Reduce(intersect, set_list[c("A", "B", "C")])
length(common_ABC)
[1] 64
# Items unique to A (in A, in neither B nor C)
unique_A <- setdiff(set_list$A, union(set_list$B, set_list$C))
length(unique_A)
[1] 85

Ce sont les mêmes effectifs que venn.diagram() affiche dans chaque région — pratique quand vous avez besoin des éléments réels (p. ex. les noms de gènes partagés) pour l’étape suivante d’une analyse.

Enregistrer le diagramme dans un fichier

venn.diagram() a été conçu pour écrire directement une image prête à publier. Donnez-lui un filename avec une extension d’image et il enregistre la figure au lieu de renvoyer un objet :

library(VennDiagram)

venn.diagram(
  x = set_list,
  filename = "venn-4-sets.png",
  imagetype = "png",
  height = 1200, width = 1200, resolution = 300,
  fill = c("#3a86d4", "#f4a259", "#5fad56", "#d6584f"),
  alpha = 0.5, lty = "blank"
)

imagetype accepte "png", "tiff" ou "svg" ; height/width/resolution définissent la taille de sortie. Lorsque vous voulez plutôt le diagramme à l’intérieur d’un document knitr/R Markdown ou dans le volet de tracé, utilisez filename = NULL + grid.draw() comme montré ci-dessus.

L’alternative ggplot : ggvenn et ggVennDiagram

Si vous préférez la grammaire des graphiques, deux extensions ggplot2 construisent des diagrammes de Venn comme des objets ggplot que vous pouvez thématiser et combiner comme tout autre graphique (ceux-ci ne sont pas exécutés ici, mais les recettes sont standard) :

  • ggvenn attribue une couleur par ensemble, à la manière de VennDiagram :

    library(ggvenn)
    ggvenn(
      set_list,
      fill_color = c("#0073C2", "#EFC000", "#868686", "#CD534C"),
      stroke_size = 0.5, set_name_size = 4
    )
  • ggVennDiagram associe la couleur de remplissage de chaque région à son effectif, de sorte que les chevauchements plus denses ressortent :

    library(ggVennDiagram)
    ggVennDiagram(set_list, label_alpha = 0) +
      ggplot2::scale_fill_gradient(low = "#deebf7", high = "#08519c")

Les deux renvoient des objets ggplot, vous pouvez donc ajouter theme_minimal(), des titres ou des facettes. Installez-les avec install.packages(c("ggvenn", "ggVennDiagram")). Utilisez VennDiagram pour le plus grand contrôle sur une figure classique en noir et blanc ou en couleur ; utilisez ggVennDiagram quand vous voulez que les effectifs de chevauchement soient affichés en gradient de couleur.

🟢 Avec un agent IA

Demandez à Prova « pourquoi mon diagramme de Venn enregistre-t-il un fichier au lieu de s’afficher dans R ? » — elle répond avec du code R que vous pouvez exécuter, donc la correction est reproductible. The runtime is the judge. Demander à Prova →

Problèmes courants

venn.diagram() écrit un fichier au lieu de tracer. C’est le comportement par défaut — il est conçu pour exporter une image. Pour afficher le diagramme dans R (ou l’intégrer dans un document), passez filename = NULL pour qu’il renvoie un objet grid, puis dessinez-le : grid.newpage(); grid.draw(venn.diagram(x, filename = NULL)).

Un fichier VennDiagram*.log ne cesse d’apparaître. VennDiagram écrit un fichier journal futile.logger à chaque appel. Faites-le taire en ajoutant futile.logger::flog.threshold(futile.logger::ERROR, name = "VennDiagramLogger") une fois en haut de votre script, avant tout appel à venn.diagram().

Chaque appel s’ajoute au diagramme précédent. grid n’efface pas la page automatiquement. Appelez grid.newpage() juste avant grid.draw() (ou avant un appel draw.pairwise.venn() / draw.triple.venn()) pour que chaque diagramme démarre sur une page neuve.

Questions fréquentes

Installez et chargez le package VennDiagram, mettez vos groupes dans une liste nommée de vecteurs (list(A = ..., B = ...)), puis appelez venn.diagram(x, filename = NULL) et dessinez le résultat avec grid.draw(). Pour seulement deux ou trois ensembles, vous pouvez aussi utiliser draw.pairwise.venn() ou draw.triple.venn() avec les effectifs directement.

VennDiagram trace clairement 2 à 4 ensembles (quatre ensembles utilisent des ellipses pour que chaque région reste étiquetée). Au-delà de quatre ensembles, les régions deviennent trop petites à lire — passez à un UpSet plot (UpSetR) pour cinq groupes ou plus.

Passez un vecteur de couleurs à fill — une par ensemble — et contrôlez la transparence avec alpha (p. ex. alpha = 0.5). Supprimez les contours des cercles avec lty = "blank". Les mêmes arguments fonctionnent dans venn.diagram() et les fonctions draw.*.

Utilisez une extension ggplot2 : ggvenn (une couleur par ensemble) ou ggVennDiagram (couleur de région associée à l’effectif). Les deux prennent la même liste nommée et renvoient un objet ggplot que vous pouvez thématiser et combiner — p. ex. ggvenn(set_list) ou ggVennDiagram(set_list, label_alpha = 0).

Donnez à venn.diagram() un filename avec une extension d’image et définissez imagetype ("png", "tiff" ou "svg"), plus height, width et resolution. Il écrit la figure directement — pas besoin de png()/dev.off() séparés.

Testez vos connaissances

À partir d’une liste nommée de trois vecteurs, tracez un diagramme de Venn à trois ensembles avec venn.diagram() qui : l’affiche dans R (pas un fichier), utilise trois couleurs fill adaptées au daltonisme à alpha = 0.5, supprime les contours des cercles, et renomme les ensembles en "Group 1", "Group 2", "Group 3".

set.seed(1)
pool <- paste0("id", 1:200)
groups <- list(
  G1 = sample(pool, 80),
  G2 = sample(pool, 90),
  G3 = sample(pool, 70)
)
# Your venn.diagram() call here

Passez la liste à x, mettez filename = NULL, donnez trois couleurs à fill et alpha = 0.5, mettez lty = "blank", et renommez avec category.names. Puis grid.newpage() et dessinez le résultat avec grid.draw().

library(VennDiagram)
library(grid)

set.seed(1)
pool <- paste0("id", 1:200)
groups <- list(
  G1 = sample(pool, 80),
  G2 = sample(pool, 90),
  G3 = sample(pool, 70)
)

venn_obj <- venn.diagram(
  x = groups,
  filename = NULL,
  category.names = c("Group 1", "Group 2", "Group 3"),
  fill = c("#3a86d4", "#f4a259", "#5fad56"),
  alpha = 0.5, lty = "blank"
)

grid.newpage()
grid.draw(venn_obj)

filename = NULL renvoie un objet dessinable, fill + alpha colorent les cercles semi-transparents, et category.names réétiquette les ensembles.

Vérification rapide. Vous appelez venn.diagram(set_list) et rien n’apparaît dans le volet de tracé — à la place un .png surgit dans votre répertoire de travail. Quel changement unique affiche le diagramme dans R ?

Ajoutez filename = NULL pour que venn.diagram() renvoie un objet grid, puis dessinez-le avec grid.newpage(); grid.draw(...). Avec un filename non-NULL, il écrit toujours sur le disque à la place.

Conclusion

VennDiagram est la façon directe de tracer un diagramme de Venn en R : une liste nommée dans venn.diagram() (ou les fonctions draw.pairwise.venn() / draw.triple.venn() pour 2–3 ensembles), fill et alpha pour l’apparence, category.names pour les étiquettes, et filename pour enregistrer ou filename = NULL + grid.draw() pour afficher. Pour une figure native ggplot, optez pour ggvenn ou ggVennDiagram ; pour cinq ensembles ou plus, un UpSet plot.

Leçons connexes

  • Couleurs en R — construisez les palettes adaptées au daltonisme utilisées pour les remplissages des cercles. · Ajouter une légende — étiquetez les groupes sur les graphiques R de base. · Diagramme en barres — une autre façon de comparer les tailles de groupes et les effectifs.
  • Pour aller plus loin : Visualisation de données — le pilier. · ggplot2 — la série complète de la grammaire des graphiques.
Cette page vous a-t-elle été utile ?

Recevez les nouvelles leçons R & Python par e-mail

Pratique, reproductible, sans spam. Désinscription à tout moment.

Double opt-in. Nous ne partageons jamais votre e-mail.

Partager cette pageXLinkedInRedditHN
Note

Cette leçon est reproductible : chaque figure a été produite par le code affiché, exécuté lors de la génération du site (si elles s’affichent, le code fonctionne). Copiez n’importe quel bloc et exécutez-le pour les reproduire. The runtime is the judge.

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {Diagramme de Venn en R : en faire un avec VennDiagram},
  date = {2026-06-27},
  url = {https://www.datanovia.com/learn/data-visualization/venn-diagram-in-r},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Diagramme de Venn en R : en faire un avec VennDiagram.” 2026. June 27. https://www.datanovia.com/learn/data-visualization/venn-diagram-in-r.