Histogramme en R : hist() et courbes de densité

Regroupez une distribution avec hist(), superposez une courbe de densité et tracez une densité lisse en R de base

Dessinez un histogramme avec la fonction hist() de R de base et un graphique de densité avec density() : contrôlez les classes avec breaks, passez de la fréquence à la densité (freq = FALSE), réglez les couleurs, superposez une courbe de densité lisse sur un histogramme, remplissez une densité avec polygon() et ajoutez une ligne de moyenne et un rug.

Date de publication

27 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • Dessinez un histogramme avec hist(x) — aucun package requis ; il regroupe un vecteur numérique en classes et compte chaque classe.
  • Contrôlez les classes avec breaks : un nombre (breaks = 30), un vecteur de bornes ou une règle ("Sturges", "FD", "Scott").
  • Passez l’axe des y des comptages à une échelle de densité avec freq = FALSE (équivalent à prob = TRUE) — nécessaire pour superposer une courbe.
  • Superposez une courbe lisse avec lines(density(x)) sur un histogramme freq = FALSE ; tracez une densité seule avec plot(density(x)).
  • polygon() remplit sous une densité ; abline(v = mean(x)) marque la moyenne et rug(x) montre les valeurs brutes.

Introduction

Vous avez une colonne de nombres — des notes d’examen, des temps d’attente, des miles par gallon — et vous voulez voir sa distribution : où les valeurs s’accumulent, si elle est asymétrique, s’il y a deux bosses. Deux fonctions de R de base répondent à cela. hist() regroupe les valeurs en barres (un histogramme) ; density() avec plot() dessine une courbe lisse (une estimation de densité par noyau). Aucune des deux n’a besoin de package.

Cette leçon couvre les deux. Nous commençons avec hist(), contrôlons le nombre de classes, passons d’un axe de comptage à un axe de densité, et ajoutons de la couleur. Puis nous superposons une courbe de densité lisse sur l’histogramme, traçons une densité autonome, la remplissons, et terminons avec une ligne de moyenne et un rug.

Vous préférez la grammaire des graphiques ? geom_histogram() et geom_density() font la même chose dans ggplot2 — voir la série ggplot2.

Un histogramme de base avec hist()

hist() prend un vecteur numérique et dessine les barres. Nous utilisons faithful$waiting — le temps d’attente entre les éruptions du geyser Old Faithful, une distribution bimodale classique. col remplit les barres et border = "white" les sépare.

hist(faithful$waiting,
     col = "#3a86d4", border = "white",
     main = "Old Faithful waiting times",
     xlab = "Waiting time (minutes)")

A base R histogram of Old Faithful waiting times with azure bars on a white background, showing two clear humps around 55 and 80 minutes.

Les deux bosses sont le signal : les éruptions suivent soit une attente courte, soit une attente longue. main définit le titre et xlab étiquette l’axe — sinon hist() utilise par défaut un titre générique et le nom de la variable.

Contrôler les classes avec breaks

Le nombre de classes change l’image. Par défaut, hist() utilise la règle de Sturges ; breaks la remplace. Passez un seul nombre comme suggestion pour le compte, un vecteur pour des bornes de classe exactes, ou le nom d’une règle.

op <- par(mfrow = c(1, 2))
hist(faithful$waiting, breaks = 10, col = "#3a86d4", border = "white",
     main = "breaks = 10", xlab = "Waiting time")
hist(faithful$waiting, breaks = 30, col = "#3a86d4", border = "white",
     main = "breaks = 30", xlab = "Waiting time")

Two base R histograms of waiting times side by side: the left with about ten wide bins, the right with thirty narrow bins, both showing the bimodal shape.

par(op)

Trop peu de classes masque la structure ; trop nombreuses transforment l’histogramme en bruit. Un seul nombre est un indicehist() l’arrondit à des bornes « jolies », vous pouvez donc obtenir un peu plus ou un peu moins de classes que demandé.

Pour des bornes exactes, passez un vecteur. Ici nous fixons des classes de largeur fixe de 5 minutes :

hist(faithful$waiting,
     breaks = seq(40, 100, by = 5),
     col = "#3a86d4", border = "white",
     main = "Fixed 5-minute bins", xlab = "Waiting time")

A base R histogram of waiting times with bins of exactly five minutes, defined by an explicit vector of break points from 40 to 100.

Un vecteur vous donne exactement les bornes que vous spécifiez (ici 40, 45, …, 100) — utile quand vous voulez des classes alignées sur des nombres ronds significatifs. Vous pouvez aussi nommer une règle : "Sturges" (le défaut), "FD" (Freedman–Diaconis, robuste aux valeurs aberrantes) ou "Scott". "FD" est un bon défaut pour des données asymétriques.

Fréquence et densité

Par défaut, l’axe des y montre des comptages (fréquence). Définissez freq = FALSE pour le passer à une échelle de densité, où l’aire totale des barres vaut 1. (prob = TRUE fait la même chose.) Vous avez besoin de cette échelle pour superposer une courbe de densité — une courbe a une intégrale de 1, les barres doivent donc l’avoir aussi, sinon les deux ne s’aligneront pas.

op <- par(mfrow = c(1, 2))
hist(faithful$waiting, col = "#3a86d4", border = "white",
     main = "freq = TRUE (counts)", xlab = "Waiting time")
hist(faithful$waiting, freq = FALSE, col = "#3a86d4", border = "white",
     main = "freq = FALSE (density)", xlab = "Waiting time")

Two base R histograms of waiting times side by side: the left on a count axis labelled Frequency, the right on a density axis labelled Density with small decimal values.

par(op)

La forme est identique — seul l’axe des y change, des comptages à une densité (les petits décimaux à droite). Tournez-vous vers freq = FALSE chaque fois que vous voulez comparer l’histogramme à une courbe ou à une autre distribution de taille différente.

Un graphique de densité avec density()

density() estime une courbe lisse à partir des données (une estimation de densité par noyau) ; plot() la dessine. C’est le graphique de densité autonome — pas d’histogramme. Nous utilisons mtcars$mpg ici.

dens <- density(mtcars$mpg)
plot(dens,
     col = "#3a86d4", lwd = 2,
     main = "Density of mpg", xlab = "Miles per gallon")

A base R density plot of miles per gallon as a smooth azure curve rising to a peak near 18 mpg and tailing off to the right.

density() renvoie les x/y de la courbe ; plot() la dessine. lwd = 2 épaissit la ligne. La régularité est réglée par la largeur de bande — density(mtcars$mpg, adjust = 2) la rend plus lisse, adjust = 0.5 la rend plus ondulée ; le défaut convient généralement.

Remplir sous la densité avec polygon()

Pour ombrer l’aire sous la courbe, dessinez d’abord la ligne, puis passez le même objet de densité à polygon(), qui remplit la forme fermée.

dens <- density(mtcars$mpg)
plot(dens, col = "#3a86d4", lwd = 2,
     main = "Density of mpg (filled)", xlab = "Miles per gallon")
polygon(dens, col = "#3a86d4", border = "#3a86d4")

A base R density plot of miles per gallon with the area under the smooth curve filled in solid azure.

polygon(dens, ...) réutilise les coordonnées de la courbe et les remplit. Pour un remplissage plus doux, passez une couleur semi-transparente, par exemple col = adjustcolor("#3a86d4", alpha.f = 0.4).

Superposer une courbe de densité sur un histogramme

La combinaison la plus utile : un histogramme pour les comptages par classe et une courbe lisse pour la tendance. La règle, c’est l’axe des y. Dessinez l’histogramme avec freq = FALSE pour qu’il soit sur une échelle de densité, puis ajoutez la courbe avec lines(density(x)) — les deux sont maintenant sur la même échelle et la courbe se pose sur les barres.

hist(faithful$waiting,
     freq = FALSE,                      # density scale, so the curve lines up
     col = "#cfe0f5", border = "white",
     main = "Histogram with density curve",
     xlab = "Waiting time (minutes)")

lines(density(faithful$waiting), col = "#3a86d4", lwd = 2)
rug(faithful$waiting)                   # raw values as ticks along the axis

A base R histogram of Old Faithful waiting times on a density scale with a smooth azure density curve overlaid, tracing the two humps of the bars, and a rug of raw values along the bottom axis.

freq = FALSE est l’argument porteur — retirez-le et les barres de l’histogramme (comptages, jusqu’à près de 30) écrasent la courbe (valeurs proches de 0.03), si bien que la courbe s’aplatit jusqu’à rien le long de l’axe. Avec les deux sur une échelle de densité, elles partagent la même plage. rug() ajoute une marque pour chaque valeur brute le long du bas, pour que vous voyiez où les données se situent réellement.

Ajouter une ligne de moyenne

Marquez une valeur de synthèse avec abline(). abline(v = ...) dessine une ligne verticale ; passez la moyenne mean() (ou la médiane median()) des données. lty = 2 la rend en pointillés pour qu’elle se lise comme une annotation, pas comme une partie des données.

dens <- density(mtcars$mpg)
plot(dens, col = "#3a86d4", lwd = 2,
     main = "Density of mpg with mean", xlab = "Miles per gallon")
abline(v = mean(mtcars$mpg), col = "#e15759", lwd = 2, lty = 2)

A base R density plot of miles per gallon with a dashed vertical red line marking the mean at about 20 mpg.

abline(v = mean(mtcars$mpg)) pose la ligne à la moyenne. Ajoutez une étiquette avec text(mean(mtcars$mpg), 0.06, "mean", col = "#e15759") si vous voulez la nommer sur le graphique. Le même abline(v = ...) fonctionne sur un histogramme.

Essayez en direct

Changez le jeu de données (iris$Sepal.Length), les classes (breaks) ou les couleurs et appuyez sur Run — cela s’exécute dans votre navigateur via webR, sans installation.

🟢 Avec un agent IA

Demandez à Prova « pourquoi ma courbe de densité est-elle plate au-dessus des barres de l’histogramme ? » — elle répond avec du code R de base que vous pouvez exécuter, donc la correction est reproductible. The runtime is the judge. Demander à Prova →

Problèmes courants

La courbe de densité est une ligne plate au-dessus de l’histogramme. C’est la non-concordance d’échelle de l’axe des y. Un hist() par défaut utilise un axe de comptage (valeurs jusqu’à 30+) ; une courbe de densité vit sur un axe de densité (valeurs proches de 0.03). Dessinées ensemble, la courbe s’aplatit jusqu’à la ligne de base. Corrigez-la en mettant l’histogramme sur la même échelle : hist(x, freq = FALSE) (ou prob = TRUE) avant lines(density(x)).

L’histogramme et la courbe ne couvrent pas la même largeur. hist() ne s’étend que jusqu’à la plage des données, mais density() lisse un peu au-delà des deux extrémités. Si la courbe déborde du graphique, fixez la plage des x lorsque vous dessinez l’histogramme, par exemple hist(x, freq = FALSE, xlim = range(density(x)$x)), pour que les deux tiennent.

Questions fréquentes

Appelez hist(x) sur un vecteur numérique — aucun package requis. Ajoutez col pour remplir les barres, border = "white" pour les séparer, et main/xlab pour le titre et l’étiquette d’axe. Utilisez breaks pour contrôler le nombre de classes.

Définissez breaks : un seul nombre est un compte suggéré (hist(x, breaks = 30)), un vecteur donne des bornes de classe exactes (breaks = seq(0, 100, by = 5)), ou un nom de règle ("Sturges", "FD", "Scott"). "FD" (Freedman–Diaconis) est robuste pour des données asymétriques.

Calculez l’estimation avec density(x) et dessinez-la avec plot(density(x)). Pour la superposer sur un histogramme, dessinez d’abord l’histogramme avec freq = FALSE, puis ajoutez la courbe avec lines(density(x)) pour que les deux partagent une échelle de densité.

Dessinez l’histogramme sur une échelle de densité — hist(x, freq = FALSE) (ou prob = TRUE) — puis ajoutez lines(density(x)). L’étape freq = FALSE est essentielle : elle met les barres et la courbe sur le même axe des y pour que la courbe ne s’aplatisse pas jusqu’à la ligne de base.

freq = TRUE (le défaut) montre des comptages bruts sur l’axe des y ; freq = FALSE montre une densité où les aires des barres ont une somme de 1 (prob = TRUE est équivalent). Utilisez freq = FALSE pour comparer l’histogramme à une courbe de densité ou à une autre distribution de taille différente.

Testez vos connaissances

À partir de iris$Sepal.Length, dessinez un histogramme sur une échelle de densité, superposez une courbe de densité lisse en azur ("#3a86d4"), et ajoutez une ligne verticale en pointillés à la moyenne.

Passez freq = FALSE à hist() pour que la courbe s’aligne. Puis lines(density(x), ...) et abline(v = mean(x), lty = 2).

x <- iris$Sepal.Length

hist(x, freq = FALSE, col = "#cfe0f5", border = "white",
     main = "Sepal length", xlab = "Sepal length (cm)")
lines(density(x), col = "#3a86d4", lwd = 2)
abline(v = mean(x), col = "#e15759", lwd = 2, lty = 2)

freq = FALSE met l’histogramme sur la même échelle de densité que la courbe, pour que les deux s’alignent.

Vérification rapide. Votre courbe de densité superposée sur hist() apparaît comme une ligne plate le long de l’axe des x. Quelle en est la cause la plus probable ?

L’histogramme est sur une échelle de comptage, pas une échelle de densité. Ajoutez freq = FALSE (ou prob = TRUE) à hist() pour que les barres et la courbe partagent le même axe des y.

Conclusion

hist() et density() sont les deux outils de R de base pour une distribution. Regroupez avec hist(), ajustez les barres avec breaks, et passez à une échelle de densité avec freq = FALSE. Dessinez une courbe lisse avec plot(density(x)), remplissez-la avec polygon(), et superposez-la sur un histogramme avec lines(density(x)) — toujours sur un histogramme freq = FALSE pour que les échelles correspondent. Terminez avec abline(v = mean(x)) et rug() pour annoter.

Leçons connexes

Cette page vous a-t-elle été utile ?

Prouvez que vous savez le faire. Maîtrisez toute la série R Base Graphics — 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 : 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), et le bac à sable se réexécute en direct dans votre navigateur. Modifiez n’importe quel bloc et appuyez sur Run. The runtime is the judge.

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {Histogramme en R : hist() et courbes de densité},
  date = {2026-06-27},
  url = {https://www.datanovia.com/learn/data-visualization/r-base/histogram-density},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Histogramme en R : hist() et courbes de densité.” 2026. June 27. https://www.datanovia.com/learn/data-visualization/r-base/histogram-density.