Mosaïque en R : graphiques en ballons et mosaïques pour données catégorielles
Visualisez un tableau de contingence avec un graphique en ballons (ggpubr) et une mosaïque (vcd)
Visualisez des données catégorielles multivariées en R. Construisez un tableau de contingence avec table() et xtabs(), tracez un graphique en ballons avec ggballoonplot() de ggpubr, et une mosaïque proportionnelle aux aires avec mosaic() de vcd — en lisant la taille des tuiles et les résidus ombrés pour repérer les associations.
Date de publication
27 juin 2026
Modifié
7 juillet 2026
AstucePoints clés
Construisez un tableau de contingence à partir de données brutes avec table() ou xtabs() de R de base — l’entrée attendue par chacun des graphiques ci-dessous.
Un graphique en ballons (ggpubr::ggballoonplot()) trace une grille de points dont la taille et la couleur varient avec le comptage de chaque cellule — la vue la plus lisible d’un tableau de fréquences.
Une mosaïque (vcd::mosaic()) divise un rectangle en tuiles proportionnelles aux aires, si bien que l’image est la distribution des fréquences sur deux variables ou plus.
Ajoutez shade = TRUE et la mosaïque colore ses tuiles selon les résidus de Pearson — bleu là où un comptage est supérieur à ce que prédit l’indépendance, rouge là où il est inférieur — transformant le graphique en un test rapide d’association.
Pour un grand tableau ou une analyse formelle de l’association, utilisez plutôt l’analyse des correspondances (lien à la fin) — ces graphiques sont faits pour les petits tableaux faciles à parcourir.
Introduction
Vous avez un tableau de comptages croisés selon deux variables catégorielles ou plus — couleur des cheveux par couleur des yeux, classe des passagers par survie, tâche par qui l’effectue. Un diagramme en barres fonctionne pour un seul regroupement, mais dès que vous disposez d’un tableau de contingence complet, vous voulez une seule image qui montre où les comptages se concentrent et quelles combinaisons sont sur- ou sous-représentées.
Deux graphiques font cela bien pour les petits tableaux. Un graphique en ballons dispose le tableau sous forme de grille de points, dimensionnés et colorés par comptage — facile à parcourir. Une mosaïque transforme le tableau en tuiles proportionnelles aux aires, si bien que la géométrie du graphique est la distribution conjointe, et les résidus ombrés signalent les cellules qui rompent l’indépendance. Cette leçon construit les deux à partir d’un tableau de contingence brut, en utilisant ggpubr pour le graphique en ballons et vcd pour la mosaïque.
Installez les deux paquets une seule fois :
install.packages(c("ggpubr", "vcd"))
Construire le tableau de contingence
Tout ce qui suit part d’un tableau de contingence : un croisement de comptages. R de base vous donne deux façons d’en créer un. table() croise des vecteurs bruts ; xtabs() fait de même à partir d’une formule, et agrège aussi un data frame qui contient déjà des fréquences. Nous utiliserons les données intégrées HairEyeColor — la couleur des cheveux, la couleur des yeux et le sexe de 592 étudiants en statistiques, déjà stockés sous forme de tableau à trois dimensions.
# HairEyeColor ships as a 3-way table (Hair x Eye x Sex)data("HairEyeColor")# Collapse over Sex to get a 2-way Hair x Eye tablehair_eye <-margin.table(HairEyeColor, margin =c(1, 2))hair_eye
Eye
Hair Brown Blue Hazel Green
Black 68 20 15 5
Brown 119 84 54 29
Red 26 17 14 14
Blond 7 94 10 16
margin.table() somme le tableau tridimensionnel sur la dimension Sex, laissant un tableau Hair × Eye propre. Si vos données étaient un data frame long d’une ligne par observation, vous construiriez le même tableau avec table(df$Hair, df$Eye) ; s’il contenait déjà une colonne Freq, xtabs(Freq ~ Hair + Eye, data = df) l’assemblerait. Le résultat est la matrice que chaque graphique ci-dessous consomme.
# Same idea from a data frame of counts, via a formuladf <-as.data.frame(HairEyeColor)head(df, 3)
Hair Eye Sex Freq
1 Black Brown Male 32
2 Brown Brown Male 53
3 Red Brown Male 10
xtabs(Freq ~ Hair + Eye, data = df)
Eye
Hair Brown Blue Hazel Green
Black 68 20 15 5
Brown 119 84 54 29
Red 26 17 14 14
Blond 7 94 10 16
L’appel as.data.frame() transforme le tableau en sa forme longue, d’une ligne par cellule (Hair, Eye, Sex, Freq) que ggballoonplot() apprécie — gardez les deux formes à portée de main, car les deux voies de tracé veulent des entrées différentes.
Graphique en ballons avec ggpubr
Un graphique en ballons trace le tableau de contingence comme une matrice graphique : un point par cellule, sa taille (et, optionnellement, sa couleur) proportionnelle au comptage. Il se lit plus vite qu’un mur de nombres et plus vite qu’un diagramme en barres juxtaposées dès que vous avez plus de quelques catégories. La fonction est ggpubr::ggballoonplot().
Passée une matrice, elle associe la taille des points directement à la valeur de la cellule. Associer fill à la même valeur ajoute un canal de couleur, si bien que les gros points sombres marquent les cellules les plus chargées. Nous enveloppons le tableau dans unclass() pour retirer la classe "table" — ggballoonplot() veut une matrice simple ou un data frame long, pas un objet table brut.
library(ggpubr)ggballoonplot(unclass(hair_eye), fill ="value") +scale_fill_viridis_c(option ="C")
Chaque ligne est une couleur des yeux, chaque colonne une couleur des cheveux, et le point à leur intersection est dimensionné par le comptage. fill = "value" colore les points selon le même comptage et scale_fill_viridis_c() donne un dégradé perceptuellement uniforme et une palette adaptée au daltonisme. Les points les plus grands et les plus vifs — cheveux bruns avec yeux bruns ou bleus — sont les combinaisons les plus courantes en un coup d’œil.
Lorsque vous avez une troisième variable, ggballoonplot() la décline en facettes. Ici nous conservons Sex et passons le data frame long, en nommant explicitement les axes, la colonne de taille et la facette — un panneau par sexe.
library(ggpubr)df <-as.data.frame(HairEyeColor)ggballoonplot( df, x ="Hair", y ="Eye",size ="Freq", fill ="Freq",facet.by ="Sex",ggtheme =theme_bw()) +scale_fill_viridis_c(option ="C")
x, y et size nomment les colonnes du data frame long, fill = "Freq" colore selon le même comptage, et facet.by = "Sex" divise la grille en un panneau par sexe pour que vous puissiez comparer les deux distributions côte à côte. C’est la force du graphique en ballons : une troisième dimension vous coûte une facette, pas un enchevêtrement de barres.
Mosaïque avec vcd
Une mosaïque est une vue proportionnelle aux aires du même tableau. Partez d’un rectangle, divisez-le horizontalement en proportion des totaux de la première variable, divisez chaque morceau verticalement selon la deuxième variable, et ainsi de suite. L’aire de chaque tuile est proportionnelle au comptage de sa cellule, si bien que l’image elle-même est la distribution conjointe des fréquences. vcd::mosaic() en est l’implémentation soignée (le mosaicplot() de R de base fait la même chose avec moins d’options).
library(vcd)mosaic(hair_eye, main ="Hair colour vs eye colour")
Les colonnes larges sont des couleurs de cheveux courantes ; les tuiles hautes au sein d’une colonne sont des couleurs d’yeux courantes pour cette couleur de cheveux. Le graphique rend visibles les distributions marginale et conditionnelle à la fois — les étudiants aux cheveux bruns dominent la largeur, et parmi eux les yeux bruns et bleus prennent le plus de hauteur.
Résidus ombrés : transformer la mosaïque en test d’association
Ajoutez shade = TRUE et vcd colore chaque tuile selon son résidu de Pearson — l’écart entre le comptage observé et ce que vous attendriez si les deux variables étaient indépendantes. Les tuiles bleues sont sur-représentées (plus que ne le prédit l’indépendance), les tuiles rouges sous-représentées ; plus la couleur est profonde, plus l’écart est grand. La légende legend = TRUE montre l’échelle des résidus.
library(vcd)mosaic(~ Hair + Eye, data = hair_eye,shade =TRUE, legend =TRUE,main ="Hair vs eye colour: shaded residuals")
L’ombrage se lit comme un récit : les cheveux clairs (blonds) avec des yeux bleus sont fortement bleus — bien plus courants que l’indépendance ne le prédit — tandis que les cheveux clairs avec des yeux bruns sont fortement rouges. Ce motif bleu/rouge visible est l’association entre la couleur des cheveux et celle des yeux, le même signal qu’un test du khi-deux rapporte sous forme de petite p-value. La mosaïque vous montre où vit la dépendance, pas seulement qu’elle existe.
Graphiques d’association — une brève mention
vcd::assoc() est le proche cousin de la mosaïque. Au lieu de dimensionner les tuiles par comptage, il dessine chaque cellule sous forme de barre dont la hauteur est le résidu de Pearson et dont la largeur est fixe — si bien que les résidus s’alignent sur une ligne de base commune et sont faciles à comparer directement. Utilisez mosaic() quand vous voulez les fréquences et les résidus dans une seule image ; tournez-vous vers assoc() quand les résidus sont l’essentiel.
library(vcd)assoc(hair_eye, shade =TRUE, main ="Hair vs eye colour: association plot")
Les barres au-dessus de la ligne de base (bleues) marquent les cellules sur-représentées, les barres en dessous (rouges) les sous-représentées — les mêmes résidus que la mosaïque ombrée, lus depuis une ligne de base plate plutôt que d’après la couleur des tuiles.
🟢 Avec un agent IA
Demandez à Prova« comment lire les tuiles bleues et rouges d’une mosaïque vcd ? » — elle répond avec du code R que vous pouvez exécuter, donc l’explication est reproductible. The runtime is the judge.Demander à Prova →
Problèmes courants
ggballoonplot() affiche de minuscules points uniformes. Les valeurs de votre tableau sont sur une plage étroite, ou vous avez passé des données brutes au lieu d’un tableau. Vérifiez que l’entrée est un tableau de contingence (sortie de table()/xtabs()) ou un data frame long, et associez size/fill à la colonne de comptage — ggballoonplot(tab, fill = "value").
Les tuiles de la mosaïque ne sont pas colorées selon l’association. Un simple mosaic(tab) ne montre que les fréquences. Il vous faut shade = TRUE (et généralement legend = TRUE) pour colorer les tuiles selon les résidus de Pearson ; sans cela le graphique est en niveaux de gris et ne vous dit rien sur l’indépendance.
mosaic() produit une erreur sur un data frame.vcd::mosaic() attend un tableau/array ou une formule plus data, pas un data frame ordonné d’une ligne par observation. Construisez d’abord le tableau avec table()/xtabs(), ou utilisez l’interface formule mosaic(~ Hair + Eye, data = your_table).
Foire aux questions
NoteComment faire une mosaïque en R ?
Construisez un tableau de contingence avec table() ou xtabs(), puis appelez vcd::mosaic(your_table). Ajoutez shade = TRUE pour colorer les tuiles selon les résidus de Pearson (bleu = sur-représenté, rouge = sous-représenté) et legend = TRUE pour l’échelle des résidus. Le mosaicplot() de R de base est une alternative plus légère avec moins d’options.
NoteQu’est-ce qu’un graphique en ballons et quand l’utiliser ?
Un graphique en ballons trace un tableau de contingence sous forme de grille de points dont la taille et la couleur varient avec le comptage de la cellule. Utilisez-le quand vous voulez parcourir un tableau de fréquences à la recherche de ses cellules les plus chargées plus vite qu’en lisant des nombres ou un diagramme en barres juxtaposées. En R, ggpubr::ggballoonplot() en crée un à partir d’un tableau ou d’un data frame long.
NoteComment créer un tableau de contingence en R ?
Utilisez R de base : table(x, y) croise deux vecteurs d’observations brutes, tandis que xtabs(Freq ~ x + y, data = df) construit le même tableau à partir d’un data frame contenant déjà des comptages. Pour des dimensions supérieures, ajoutez davantage de variables : table(x, y, z) ou xtabs(Freq ~ x + y + z, data = df).
NoteQue signifient les tuiles bleues et rouges d’une mosaïque ?
Avec shade = TRUE, vcd::mosaic() colore chaque tuile selon son résidu de Pearson — l’écart standardisé entre le comptage observé et le comptage attendu sous l’indépendance. Le bleu signifie que la cellule a plus d’observations que prévu, le rouge moins ; une couleur plus profonde signale un écart plus grand. Le motif est un test visuel du khi-deux d’association.
NoteMosaïque ou graphique en ballons — lequel utiliser ?
Utilisez un graphique en ballons pour lire rapidement la magnitude de chaque cellule (taille du point = comptage) et pour décliner en facettes selon une troisième variable. Utilisez une mosaïque quand vous voulez une vue proportionnelle aux aires de la distribution conjointe et des résidus ombrés qui signalent les associations. Pour un grand tableau ou une analyse formelle, passez à l’analyse des correspondances.
Testez votre compréhension
ImportantExercice : construisez un tableau et tracez les deux graphiques pour les données Titanic
Les données intégrées Titanic forment un tableau à quatre dimensions (Class, Sex, Age, Survived). Réduisez-le à un tableau bidimensionnel Class × Survived, puis (1) tracez un graphique en ballons de ce tableau coloré par comptage, et (2) tracez une mosaïque ombrée de celui-ci. Que vous apprend l’ombrage sur qui a survécu ?
data("Titanic")# 1. Collapse to a Class x Survived table# 2. ggballoonplot() it, fill by value# 3. mosaic() it with shade = TRUE
AstuceIndice
Réduisez avec margin.table(Titanic, margin = c(1, 4)) (dimensions 1 = Class, 4 = Survived). Passez le résultat directement à ggballoonplot(tab, fill = "value") et à mosaic(tab, shade = TRUE, legend = TRUE).
AstuceSolution
library(ggpubr)library(vcd)data("Titanic")class_surv <-margin.table(Titanic, margin =c(1, 4))class_surv# Balloon plotggballoonplot(class_surv, fill ="value") +scale_fill_viridis_c(option ="C")# Shaded mosaic plotmosaic(class_surv, shade =TRUE, legend =TRUE,main ="Titanic: class vs survival")
margin.table() somme le tableau à quatre dimensions sur Sex et Age. La mosaïque ombrée devient bleue pour les survivants de première classe et l’équipage décédé, et rouge pour les survivants de troisième classe — le gradient de classe visible dans la survie.
Vérification rapide. Vous appelez mosaic(my_table) et les tuiles sont toutes grises — vous voyez les fréquences mais rien sur l’association. Quel unique argument ajoute le coloriage des résidus bleu/rouge ?
AstuceAfficher la réponse
Ajoutez shade = TRUE (et généralement legend = TRUE pour l’échelle). Il colore chaque tuile selon son résidu de Pearson : bleu là où le comptage observé dépasse l’indépendance, rouge là où il n’atteint pas l’indépendance.
Conclusion
Pour un petit tableau de contingence, deux graphiques couvrent la plupart des besoins. Construisez le tableau avec table() ou xtabs() de R de base, puis tracez un graphique en ballons (ggpubr::ggballoonplot()) quand vous voulez parcourir les magnitudes des cellules et décliner en facettes selon une troisième variable, ou une mosaïque (vcd::mosaic(..., shade = TRUE)) quand vous voulez une vue proportionnelle aux aires avec des résidus ombrés qui signalent les associations. Pour un grand tableau ou une mesure formelle d’association, l’analyse des correspondances est la bonne étape suivante.
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.
@online{2026,
author = {},
title = {Mosaïque en R : graphiques en ballons et mosaïques pour
données catégorielles},
date = {2026-06-27},
url = {https://www.datanovia.com/learn/data-visualization/mosaic-balloon-plots},
langid = {fr}
}