Histogramme et graphique de densité en R (ggpubr)

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.
  • Besoin d’une signification ou de résumés par groupe sur une comparaison groupée ? Voir boîtes & violons et moyennes & barres d’erreur.
Obtenez le livre — R Graphics Essentials (PDF)

Introduction

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 mean
            rug = TRUE,              # tick marks for every observation
            bins = 30,
            xlab = "Sepal length (cm)", ylab = "Count")

A ggpubr histogram of iris sepal length with three coloured, semi-transparent groups for setosa, versicolor and virginica, each with a dashed vertical mean line, using the jco journal palette.

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 mean
          rug = TRUE,
          xlab = "Sepal length (cm)", ylab = "Density")

A ggpubr density plot of iris sepal length filled by species with the jco journal palette and a dashed vertical mean line for each species.

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 binwidthbinwidth 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 bins
            add = "mean", rug = TRUE,
            xlab = "Waiting time (min)", ylab = "Count")

A ggpubr histogram of Old Faithful waiting times in blue with a bin width of five minutes, showing two clear peaks around 55 and 80 minutes.

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 curve
            xlab = "Waiting time (min)", ylab = "Density")

A ggpubr histogram of Old Faithful waiting times in light blue with a smooth density curve overlaid on top, both on a density y-axis.

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 1
          color = "Species", fill = "Species", palette = "jco",
          xlab = "Sepal length (cm)", ylab = "Count")

A ggpubr density plot of iris sepal length by species on a count y-axis, scaling each species' curve by its sample size.

É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 <- mtcars
df$model <- rownames(mtcars)
# the cars to call out: the four thirstiest and the four most efficient
key.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")

A ggpubr histogram of mtcars miles-per-gallon in light gray with repelled text labels naming only the four most and least fuel-efficient cars on the relevant bars.

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

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.

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.

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.

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.

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

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.

# ggdensity() needs these arguments here:
#   palette = "jco",
#   add = "mean"
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.

Leçons connexes

Vous préférez un livre ? R Graphics Essentials est disponible en PDF téléchargeable — toutes les leçons de cette série, hors ligne et à vous.

Obtenir le livre (PDF) →Les leçons restent gratuites en ligne.
Cette page vous a-t-elle été utile ?

Prouvez que vous savez le faire. Maîtrisez toute la série ggpubr — suivez votre parcours, construisez des projets et obtenez un certificat.

Commencer gratuitement →

Passez à Pro — Prova illimité sur vos propres données et un certificat vérifiable qui atteste la compétence.

dès 15 $/mois facturé annuellement

Passer à Pro →

✓ Vous êtes Pro — continuez. The runtime is the judge.

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 : 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.

Réutilisation

Citation

BibTeX
@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}
}
Veuillez citer ce travail comme suit :
“Histogramme et graphique de densité en R (ggpubr).” 2026. June 22. https://www.datanovia.com/learn/data-visualization/ggpubr/histogram-density-labels.