hist(faithful$waiting,
col = "#3a86d4", border = "white",
main = "Old Faithful waiting times",
xlab = "Waiting time (minutes)")
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.
27 juin 2026
7 juillet 2026
hist(x) — aucun package requis ; il regroupe un vecteur numérique en classes et compte chaque classe.breaks : un nombre (breaks = 30), un vecteur de bornes ou une règle ("Sturges", "FD", "Scott").freq = FALSE (équivalent à prob = TRUE) — nécessaire pour superposer une courbe.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.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.
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.

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

Trop peu de classes masque la structure ; trop nombreuses transforment l’histogramme en bruit. Un seul nombre est un indice — hist() 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 :

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

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

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

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

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.
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.
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 →
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.
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.
À 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).
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.
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.
geom_histogram()/geom_density() si vous préférez la grammaire des graphiques.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.
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
✓ Vous êtes Pro — continuez. The runtime is the judge.
Prêt à passer à la vitesse supérieure ?
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.
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.
@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}
}