Des graphiques de distribution prêts à publier — groupés, avec lignes de moyenne et étiquettes de texte sélectives — en un seul appel
Créez des histogrammes et des graphiques de densité prêts à publier en R avec ggpubr. Utilisez gghistogram() et ggdensity() pour tracer une distribution colorée ou remplie par groupe, marquez la moyenne avec une ligne en tirets (add = “mean”), ajoutez un rug, et n’étiquetez que les points qui comptent avec label.select + repel. Chaque exemple est rendu pour vous et s’exécute en direct dans votre navigateur.
Date de publication
22 juin 2026
Modifié
7 juillet 2026
AstucePoints clés
gghistogram() trace un histogramme prêt pour la revue et ggdensity() la densité lissée — les deux en un seul appel, avec theme_pubr() appliqué automatiquement (vous n’ajoutez pas de thème).
Groupez par un facteur avec color =/fill = + une palette nommée ("jco", "npg", …) pour superposer ou comparer plusieurs distributions sur les mêmes axes.
Marquez le centre avec add = "mean" — une ligne verticale en tirets à la moyenne de chaque groupe — et montrez chaque observation avec add = "rug".
N’étiquetez que ce qui compte : passez label = "<col>" avec label.select = pour n’annoter qu’un sous-ensemble choisi de points, et repel = TRUE pour que les étiquettes ne se chevauchent pas.
Contrôlez les intervalles avec binwidth/bins, fixez l’axe des y aux effectifs avec y = "count" ou à la densité avec y = "density", et ajoutez une courbe normale avec add_density = TRUE.
Un histogramme et un graphique de densité répondent à la même question — à quoi ressemble cette distribution ? — et dans une publication vous les voulez généralement groupés (une courbe par condition), annotés avec la moyenne, et portant parfois quelques étiquettes de texte sur les points qui comptent. En ggplot2 de base, cela fait plusieurs couches ; le paquet ggpubr trace chacun en un seul appel, stylé pour la revue, prêt pour un panneau de figure.
Deux fonctions suffisent :
gghistogram() — un histogramme prêt à publier. Découpez les données en intervalles, colorez ou remplissez par groupe, ajoutez une ligne de moyenne, un rug, ou une courbe de densité superposée.
ggdensity() — la cousine en densité lissée. Mêmes arguments, dessinant la densité par noyau au lieu des barres — idéale quand vous voulez comparer les formes de plusieurs groupes sur un même axe.
Les deux appliquent automatiquement le theme_pubr() épuré de ggpubr, vous n’ajoutez donc pas de thème. Cette leçon parcourt le flux de travail canonique sur deux jeux de données intégrés — iris (longueur des sépales sur trois espèces, un cas multi-groupe net) et faithful (temps d’attente entre les éruptions, une seule série bimodale) — et se termine par la technique pour laquelle ggpubr est unique : les étiquettes de texte sélectives sur une distribution.
Vous voulez la grammaire sous-jacente — geom_histogram() / geom_density() couche par couche ? Voir les leçons ggplot2 histogramme et graphique de densité. ggpubr est le raccourci de publication par-dessus les mêmes geoms.
Histogramme groupé par un facteur (le graphique canonique)
Voici l’image que la plupart des gens recherchent : un histogramme de la longueur des sépales d’iris, une couleur par espèce, avec une ligne de moyenne en tirets pour chaque groupe. x est le nom de colonne sous forme de chaîne, fill/color mappent les barres à Species, palette = "jco" applique un jeu de couleurs de revue, et add = "mean" dépose une ligne verticale à la moyenne de chaque espèce. Tout le reste de la leçon est une variation de ce seul appel.
library(ggpubr)gghistogram(iris, x ="Sepal.Length",color ="Species", fill ="Species", palette ="jco",add ="mean", # dashed line at each group's meanrug =TRUE, # tick marks for every observationbins =30,xlab ="Sepal length (cm)", ylab ="Count")
color teinte le contour et fill inonde les barres ; palette accepte les jeux de couleurs de revue nommés ("jco", "npg", "lancet", "aaas"), un nom Brewer, ou un vecteur de vos propres couleurs. Quand plusieurs groupes se chevauchent, ggpubr rend les barres semi-transparentes pour que chaque distribution reste lisible.
Graphique de densité groupé par un facteur
Un graphique de densité est souvent plus clair qu’un histogramme pour comparer plusieurs groupes, parce que les courbes lissées se chevauchent lisiblement. ggdensity() prend les mêmes arguments — remplissez par groupe, appliquez une palette, marquez la moyenne.
library(ggpubr)ggdensity(iris, x ="Sepal.Length",color ="Species", fill ="Species", palette ="jco",add ="mean", # dashed line at each group's meanrug =TRUE,xlab ="Sepal length (cm)", ylab ="Density")
Utilisez alpha pour contrôler la transparence du remplissage quand de nombreux groupes se chevauchent, et add = "median" pour marquer la médiane au lieu de la moyenne.
Contrôler les intervalles
Le découpage en intervalles est le seul vrai choix d’un histogramme. Fixez le nombre d’intervalles avec bins ou la largeur de chaque intervalle avec binwidth — binwidth est généralement le contrôle le plus interprétable parce qu’il est dans les unités de vos données. Ici, nous utilisons les données à série unique faithful (temps d’attente entre les éruptions), dont la forme clairement bimodale rend le choix d’intervalle visible.
library(ggpubr)gghistogram(faithful, x ="waiting",fill ="#3a86d4", color ="#3a86d4",binwidth =5, # 5-minute binsadd ="mean", rug =TRUE,xlab ="Waiting time (min)", ylab ="Count")
binwidth et bins sont des alternatives — fixez-en une. Trop peu d’intervalles masque la structure ; trop d’intervalles transforme l’histogramme en bruit. Pour cette série bimodale, des intervalles de 5 minutes rendent les deux pics évidents.
Ajouter une courbe de densité par-dessus l’histogramme
Pour montrer la forme lissée et les effectifs bruts à la fois, superposez une courbe de densité sur l’histogramme avec add_density = TRUE. L’axe des y passe à la densité pour que la courbe et les barres partagent une échelle.
library(ggpubr)gghistogram(faithful, x ="waiting",fill ="lightgray", color ="black",bins =30,add_density =TRUE, # overlay the kernel density curvexlab ="Waiting time (min)", ylab ="Density")
Effectifs ou densité sur l’axe des y
Un histogramme unique adopte par défaut les effectifs ; un histogramme groupé adopte par défaut la densité pour que les groupes soient comparables. Contrôlez-le explicitement avec y = "count" ou y = "density" — utile quand les groupes ont des tailles d’échantillon très différentes et que vous voulez comparer les formes, pas les fréquences brutes.
library(ggpubr)ggdensity(iris, x ="Sepal.Length",y ="count", # scale by sample size, not to area 1color ="Species", fill ="Species", palette ="jco",xlab ="Sepal length (cm)", ylab ="Count")
Étiquettes de texte sélectives sur la distribution
C’est la technique pour laquelle ggpubr est conçu : annoter uniquement les points qui comptent sur une distribution. Passez label = "<colonne>" pour dessiner une étiquette de texte par observation, puis restreignez-les avec label.select à un sous-ensemble choisi — et fixez repel = TRUE pour que les étiquettes s’écartent au lieu de se chevaucher. Ici, nous traçons la distribution de la consommation de carburant de mtcars et n’étiquetons que les voitures nommées aux extrêmes.
library(ggpubr)df <- mtcarsdf$model <-rownames(mtcars)# the cars to call out: the four thirstiest and the four most efficientkey.cars <-rownames(df)[order(df$mpg)][c(1:4, (nrow(df) -3):nrow(df))]gghistogram(df, x ="mpg", y ="..count..",bins =12,fill ="lightgray", color ="black",label ="model", label.select = key.cars, repel =TRUE,font.label =list(size =9, color ="#3a86d4"),xlab ="Miles per gallon", ylab ="Number of cars")
label.select accepte un vecteur de valeurs à conserver (mises en correspondance avec la colonne d’étiquettes), si bien que vous choisissez exactement quelles observations sont annotées — les autres restent sans étiquette. Combinez-le avec font.label pour dimensionner ou colorer le texte, et avec repel = TRUE pour garder lisibles des étiquettes denses. Les étiquettes ont besoin d’une hauteur où s’attacher, le graphique est donc dessiné sur l’axe des effectifs (y = "..count..") — chaque nom se pose alors sur la barre dans laquelle tombe sa valeur. C’est exactement la recette pour mettre en évidence une poignée de gènes (ou d’échantillons) sur une distribution dans un panneau de figure : ne nommez que ce qui compte, laissez le reste sans étiquette.
Essayez en direct
Les graphiques ci-dessus ont été rendus au moment de la construction. Vous voulez expérimenter ? Modifiez le code et appuyez sur Run — il s’exécute dans votre navigateur via webR (pas de serveur, pas d’installation). Essayez de remplacer gghistogram par ggdensity, de changer la palette en "npg", de retirer add = "mean", ou d’ajuster bins.
Vous travaillez en Python ? Un guide seaborn des distributions arrive dans la série Python.
🟢 Avec un agent IA
Demandez à Prova« dois-je utiliser un histogramme ou un graphique de densité pour mes données — et comment n’étiqueter que les points qui m’intéressent ? » — elle répond avec du code que vous pouvez exécuter sur votre propre data frame, ce qui rend le choix reproductible. The runtime is the judge.Ask Prova →
Problèmes courants
La palette est ignorée / tout est d’une seule couleur. Une palette nommée comme "jco" ne colore que lorsque vous mappez une variable à color ou fill (par ex. fill = "Species"). Sans attribut esthétique de groupement, il n’y a rien à colorer — passez plutôt une seule chaîne de couleur (fill = "#3a86d4").
label.select n’étiquette rien (ou tout). Les valeurs dans label.select doivent correspondre exactement aux valeurs de la colonne label. Créez d’abord une vraie colonne d’étiquettes (par ex. df$model <- rownames(mtcars)) et passez des chaînes qui y existent.
Les étiquettes se chevauchent en une masse illisible. Ajoutez repel = TRUE pour que ggpubr (via ggrepel) les écarte, et réduisez label.select à moins de points — étiqueter chaque observation va à l’encontre du but.
Les barres groupées se masquent les unes les autres. Les histogrammes qui se chevauchent deviennent encombrés ; soit baissez alpha pour plus de transparence, soit passez à ggdensity() (les courbes lissées se chevauchent mieux), soit facettez avec facet.by = "Species".
add = "mean" ne dessine rien. Il marque la moyenne de la variable x comme une ligne verticale ; assurez-vous que x est la colonne numérique dont vous tracez la distribution (pas un facteur de groupement).
Questions fréquentes
NoteComment créer un histogramme en R avec ggpubr ?
Utilisez gghistogram() : gghistogram(iris, x = "Sepal.Length", bins = 30) dessine un histogramme prêt à publier en un seul appel — aucun réglage de theme() n’est nécessaire (il applique theme_pubr() automatiquement). Mappez une variable de groupement à fill/color (par ex. fill = "Species") et ajoutez une palette nommée (palette = "jco") pour colorer les barres par groupe.
NoteQuelle est la différence entre gghistogram() et ggdensity() ?
gghistogram() découpe les données en barres (effectifs bruts ou densité) ; ggdensity() dessine plutôt la courbe de densité par noyau lissée. Ils montrent la même distribution — les barres sont honnêtes sur la taille d’échantillon et le choix d’intervalle, tandis que la courbe de densité est plus lisse et se chevauche plus lisiblement quand vous comparez plusieurs groupes. Pour une comparaison multi-groupe, ggdensity() est généralement plus clair.
NoteComment ajouter une ligne de moyenne à un histogramme ou un graphique de densité ?
Passez add = "mean" : gghistogram(iris, x = "Sepal.Length", color = "Species", add = "mean") dessine une ligne verticale en tirets à la moyenne de chaque groupe. Utilisez add = "median" pour la médiane à la place. Cela marque le centre de la variable x, une ligne par groupe quand vous avez mappé color/fill.
NoteComment n’étiqueter que des points sélectionnés sur un graphique de distribution ?
Utilisez label avec label.select : gghistogram(df, x = "mpg", label = "model", label.select = c("Toyota Corolla", "Lincoln Continental"), repel = TRUE) n’annote que les observations nommées, laissant le reste sans étiquette. label.select prend un vecteur de valeurs mises en correspondance avec la colonne label ; repel = TRUE empêche les étiquettes de se chevaucher.
NoteComment changer le nombre d’intervalles dans gghistogram() ?
Fixez bins pour un effectif (bins = 30) ou binwidth pour la largeur de chaque intervalle en unités de données (binwidth = 5). Ce sont des alternatives — utilisez-en une. binwidth est généralement plus interprétable parce qu’il est dans les unités de votre variable ; trop peu d’intervalles masque la structure et trop d’intervalles transforme l’histogramme en bruit.
Testez vos connaissances
ImportantExercice : un graphique de densité groupé avec des lignes de moyenne
Complétez le code pour que la longueur des sépales d’iris soit dessinée comme un graphique de densitérempli par espèce avec la palette "jco", avec une ligne de moyenne en tirets pour chaque espèce et un rug.
library(ggpubr)
ggdensity(iris, x = "Sepal.Length",
color = "Species", fill = "Species", palette = "jco",
add = "mean", rug = TRUE)
library(ggpubr)ggdensity(iris, x ="Sepal.Length",color ="Species", fill ="Species", palette ="jco",add ="mean", rug =TRUE)
Vérification rapide. Vous avez cinq groupes qui se chevauchent et voulez comparer leurs formes sur un même axe. Lequel est généralement le choix le plus clair — un gghistogram() groupé ou un ggdensity() groupé — et pourquoi ?
ggdensity() : les courbes lissées se chevauchent lisiblement, alors que cinq jeux de barres qui se chevauchent s’encombrent en une masse illisible. Les histogrammes sont meilleurs pour une série unique ou une vue facettée où chaque groupe a son propre panneau.
Conclusion
Vous avez construit des graphiques de distribution prêts à publier à la manière de ggpubr : gghistogram() pour les effectifs en intervalles et ggdensity() pour la courbe lissée — colorés par groupe, avec une ligne de moyenne en tirets (add = "mean"), un rug, des intervalles contrôlables, une courbe de densité superposée, et un axe des y en effectifs ou en densité. Le geste signature est les étiquettes de texte sélectives : label + label.select + repel = TRUE n’annotent que les observations qui comptent — la recette exacte pour mettre en évidence une poignée d’échantillons sur une distribution dans un panneau de figure. Parce que ggpubr applique theme_pubr() automatiquement, chaque graphique est prêt pour la figure dès un seul appel.
Pour la grammaire sous-jacente, voir les leçons ggplot2 histogramme et graphique de densité. Pour comparer les groupes statistiquement sur ces distributions — boîtes à moustaches, violons et p-values — continuez avec boîtes & violons.
Cette leçon est reproductible : les figures sont exécutées au moment de la construction (si elles s’affichent, le code fonctionne), et le bac à sable et le quiz se réexécutent en direct dans votre navigateur. The runtime is the judge.
@online{2026,
author = {},
title = {Histogramme et graphique de densité en R (ggpubr)},
date = {2026-06-22},
url = {https://www.datanovia.com/learn/data-visualization/ggpubr/histogram-density-labels},
langid = {fr}
}