library(ggplot2)
ggplot(economics, aes(x = date, y = psavert)) +
geom_area(fill = "#3a86d4", alpha = 0.6) +
labs(x = "Date", y = "Personal savings rate (%)") +
theme_minimal()
Remplissez sous une courbe, empilez des aires par groupe et ombrez une densité avec geom_area()
Construisez un graphique en aires avec R et ggplot2 — remplissez sous une courbe avec geom_area(), combinez-le avec geom_line(), tracez un graphique en aires empilées par groupe, passez à une vue proportionnelle (100 %) avec position = “fill”, ombrez l’aire sous une courbe de densité et ajoutez une bande d’incertitude avec geom_ribbon().
12 juillet 2026
12 juillet 2026
geom_area().x et les valeurs à y ; geom_area() remplit jusqu’à zéro.geom_line() sur geom_area() pour conserver un bord net sur la bande remplie.fill — geom_area() les empile par défaut (le cousin continu du diagramme en barres empilées).position : "stack" (totaux), "fill" (proportions, 0–1) ou "identity" avec alpha (superposition, pour comparer).geom_area() sur une densité pour ombrer une distribution, et geom_ribbon() avec ymin/ymax pour tracer une bande d’incertitude autour d’une courbe.Un graphique en aires répond à une question simple — comment une quantité s’accumule-t-elle ou évolue-t-elle le long d’une dimension ordonnée ? C’est un graphique en courbes dont l’aire située sous la courbe est remplie, ce qui attire l’œil sur la magnitude et sur la manière dont les parties s’additionnent pour former un tout. En R, ggplot2 en trace un avec une seule couche, geom_area() — le compagnon rempli de geom_line(). Cette leçon en construit un pas à pas, d’une simple bande remplie à un graphique en aires empilées par groupe, une vue proportionnelle (100 %), une densité ombrée et une bande d’incertitude. Chaque figure est générée ici même, et vous pouvez réexécuter ou modifier chacune d’elles en direct.
Nous utilisons trois jeux de données intégrés. economics (fourni avec ggplot2) est une série temporelle économique mensuelle des États-Unis — nous remplissons sous le taux d’épargne personnelle (psavert). USPersonalExpenditure est une matrice base-R des dépenses personnelles aux États-Unis (en milliards de dollars) réparties sur cinq catégories à cinq points temporels (1940–1960) — idéale pour un graphique en aires empilées par groupe. faithful enregistre les durées d’attente (waiting) entre les éruptions du geyser Old Faithful — une distribution bimodale que nous ombrons sous une courbe de densité.
Associez une variable ordonnée à x et les valeurs à y, puis ajoutez une seule couche geom_area(). Elle remplit la région depuis la courbe jusqu’à zéro. Définissez fill pour la couleur et, éventuellement, alpha pour une teinte plus claire afin que les lignes de la grille restent visibles.
Une aire remplie seule a un bord supérieur peu marqué. Superposez geom_line() sur geom_area() pour tracer une courbe nette le long du sommet — un choix par défaut courant et lisible. Donnez à l’aire un alpha plus clair et à la courbe la couleur pleine afin que le contour se lise clairement.
geom_area() accepte les mêmes attributs esthétiques fixes que n’importe quelle couche ggplot2. Comme ce sont des constantes, et non des associations de données, ils se placent à l’extérieur d’aes() : fill colore l’aire, colour en trace la bordure, linetype stylise cette bordure et alpha règle la transparence. Ici, nous remplissons en azur, entourons d’une bordure tiretée plus foncée et éclaircissons le remplissage.
Pour montrer comment plusieurs séries s’additionnent pour former un total, associez la variable de regroupement à fill. geom_area() empile les groupes par défaut, de sorte que le bord supérieur est le total cumulé — l’équivalent continu d’un diagramme en barres empilées. Nous réorganisons la matrice USPersonalExpenditure en un data.frame long (une ligne par catégorie × année) avec base R, puis nous le traçons avec la palette viridis adaptée au daltonisme.
library(ggplot2)
# reshape the matrix (categories x years) to long form with base R
m <- USPersonalExpenditure
exp_long <- data.frame(
year = as.numeric(rep(colnames(m), each = nrow(m))),
category = rep(rownames(m), times = ncol(m)),
spending = as.vector(m)
)
ggplot(exp_long, aes(x = year, y = spending, fill = category)) +
geom_area() +
scale_fill_viridis_d() +
labs(x = "Year", y = "Spending ($ billions)", fill = "Category") +
theme_minimal()
Deux personnalisations que vous utiliserez souvent : déplacez la légende avec theme(legend.position = "bottom") (ou "top"/"none") et changez de palette. Pour un jeu de couleurs choisi à la main, utilisez scale_fill_manual(values = c(...)) ; pour une palette ColorBrewer, utilisez scale_fill_brewer(palette = "Set2"). Voir les couleurs dans ggplot2 pour le menu complet.
Lorsque les parts comptent plus que les totaux, définissez position = "fill". ggplot2 remet à l’échelle chaque point temporel pour qu’il somme à 1, de sorte que le graphique montre l’évolution de la proportion de chaque groupe — ici, la part des dépenses que prend chaque catégorie au fil du temps.
library(ggplot2)
m <- USPersonalExpenditure
exp_long <- data.frame(
year = as.numeric(rep(colnames(m), each = nrow(m))),
category = rep(rownames(m), times = ncol(m)),
spending = as.vector(m)
)
ggplot(exp_long, aes(x = year, y = spending, fill = category)) +
geom_area(position = "fill") +
scale_fill_viridis_d() +
labs(x = "Year", y = "Proportion of spending", fill = "Category") +
theme_minimal()
L’empilement masque la forme propre de chaque groupe, car chaque bande repose sur celle du dessous. Pour comparer les groupes sur une ligne de base commune à la place, définissez position = "identity" et ajoutez de la transparence avec alpha afin que les aires superposées restent visibles. Cela fonctionne mieux avec deux ou trois groupes.
library(ggplot2)
m <- USPersonalExpenditure
exp_long <- data.frame(
year = as.numeric(rep(colnames(m), each = nrow(m))),
category = rep(rownames(m), times = ncol(m)),
spending = as.vector(m)
)
# keep two categories for a clean overlap comparison
two <- exp_long[exp_long$category %in% c("Food and Tobacco", "Household Operation"), ]
ggplot(two, aes(x = year, y = spending, fill = category)) +
geom_area(position = "identity", alpha = 0.5) +
scale_fill_viridis_d(end = 0.7) +
labs(x = "Year", y = "Spending ($ billions)", fill = "Category") +
theme_minimal()
Avec plus de deux ou trois groupes, la superposition devient chargée. Séparez les données en un panneau par groupe avec facet_wrap() — chaque catégorie obtient sa propre aire sur sa propre échelle, facile à lire côte à côte. Voir les facettes dans ggplot2 pour toutes les options de grille.
library(ggplot2)
m <- USPersonalExpenditure
exp_long <- data.frame(
year = as.numeric(rep(colnames(m), each = nrow(m))),
category = rep(rownames(m), times = ncol(m)),
spending = as.vector(m)
)
ggplot(exp_long, aes(x = year, y = spending)) +
geom_area(fill = "#3a86d4", alpha = 0.5) +
facet_wrap(~ category, scales = "free_y") +
labs(x = "Year", y = "Spending ($ billions)") +
theme_minimal()
Une utilisation classique de geom_area() consiste à colorer l’aire sous une courbe — par exemple, pour mettre en évidence une partie d’une distribution. Calculez la densité avec la fonction de base density(), placez les x/y qu’elle renvoie dans un data.frame, puis remplissez-le. Pour mettre en valeur une région, tracez un second geom_area() sur le subset() que vous voulez assombrir. Ici, nous ombrons les durées d’attente comprises entre 70 et 90 minutes sur la distribution bimodale d’Old Faithful.
library(ggplot2)
# base density() -> a data.frame of x (waiting time) and y (density)
dens <- density(faithful$waiting)
dd <- data.frame(x = dens$x, y = dens$y)
ggplot(dd, aes(x = x, y = y)) +
geom_area(fill = "#3a86d4", alpha = 0.25) +
geom_area(data = subset(dd, x >= 70 & x <= 90),
fill = "#3a86d4", alpha = 0.7) +
geom_line(colour = "#3a86d4", linewidth = 1) +
labs(x = "Waiting time (minutes)", y = "Density") +
theme_minimal()
geom_area() remplit toujours jusqu’à zéro. Lorsque vous avez besoin d’une bande entre deux bornes arbitraires — un intervalle de confiance, une plage min–max — utilisez geom_ribbon(), qui remplit entre ymin et ymax. Ici, nous ajustons une tendance lisse au taux d’épargne avec la fonction de base loess(), prenons son erreur standard depuis predict() et ombrons une bande de ±2 SE sous la courbe de tendance.
library(ggplot2)
# smooth trend + standard error with base loess()/predict()
fit <- loess(psavert ~ as.numeric(date), data = economics)
pred <- predict(fit, se = TRUE)
band <- data.frame(
date = economics$date,
fit = pred$fit,
lo = pred$fit - 2 * pred$se.fit,
hi = pred$fit + 2 * pred$se.fit
)
ggplot(band, aes(x = date)) +
geom_ribbon(aes(ymin = lo, ymax = hi), fill = "#3a86d4", alpha = 0.3) +
geom_line(aes(y = fit), colour = "#3a86d4", linewidth = 1) +
labs(x = "Date", y = "Personal savings rate (%)") +
theme_minimal()
Les graphiques ci-dessus ont été rendus au moment de la construction. Envie d’expérimenter ? Modifiez le code et appuyez sur Run — il s’exécute dans votre navigateur via webR (sans serveur, sans installation). Essayez de changer position en "stack", "fill" ou "identity".
Vous travaillez en Python ? Un guide de graphique en aires avec matplotlib arrive dans la série Python.
Demandez à Prova « quand dois-je utiliser un graphique en aires empilées plutôt que position = ‘fill’ ou des aires superposées ? » — elle répond avec du code que vous pouvez exécuter, de sorte que l’explication est reproductible. The runtime is the judge. Demander à Prova →
Ma seule aire n’affiche qu’un bloc plat qui remplit tout le panneau. geom_area() remplit depuis la courbe jusqu’à y = 0, si bien qu’une série presque constante ressemble à un rectangle plein. Vérifiez que y est la valeur que vous vouliez tracer et que x est ordonné — si x n’est pas trié, le remplissage zigzague en revenant sur lui-même. Pour un x catégoriel, triez d’abord les niveaux du facteur.
Mes groupes s’empilent alors que je les voulais superposés (ou inversement). geom_area() utilise position = "stack" par défaut. Définissez position = "identity" (avec alpha) pour superposer les groupes sur une ligne de base commune, ou position = "fill" pour des proportions. Il n’y a pas de « dodge » pour les aires.
geom_ribbon() génère « Aesthetics must be either length 1 or the same as the data ». Chaque ligne a besoin de ses propres ymin et ymax. Construisez un unique data.frame où x, ymin et ymax ont tous la même longueur (comme dans l’exemple de la bande de tendance) plutôt que de mélanger des vecteurs de tailles différentes.
Associez une variable ordonnée à x et les valeurs à y, puis ajoutez geom_area() — par exemple ggplot(economics, aes(date, psavert)) + geom_area(fill = "#3a86d4"). Il remplit la région depuis la courbe jusqu’à zéro.
geom_line() ne trace que la courbe reliant les points ; geom_area() remplit en plus la région entre cette courbe et l’axe des x. Superposez-les pour obtenir une aire remplie avec un bord supérieur net.
Associez la variable de regroupement à fill, par exemple geom_area(aes(fill = category)). geom_area() empile les groupes par défaut, de sorte que le bord supérieur est le total cumulé.
Ajoutez position = "fill" à geom_area(). ggplot2 remet à l’échelle chaque position x pour que les groupes somment à 1, montrant la part changeante de chaque groupe au lieu des totaux absolus.
geom_area() remplit toujours jusqu’à y = 0 (un cas particulier de ruban). geom_ribbon() remplit entre deux bornes arbitraires, ymin et ymax — utilisez-le pour un intervalle de confiance ou une plage min–max autour d’une courbe.
Placez les x et y de la courbe dans un data.frame et ajoutez geom_area(). Pour mettre en évidence une région, tracez un second geom_area() sur un subset() de ces données avec un alpha plus marqué.
Partez de ce graphique en aires empilées. Modifiez un seul argument pour qu’il montre la proportion de dépenses de chaque catégorie (chaque année sommant à 1) au lieu des totaux absolus.
library(ggplot2)
m <- USPersonalExpenditure
exp_long <- data.frame(
year = as.numeric(rep(colnames(m), each = nrow(m))),
category = rep(rownames(m), times = ncol(m)),
spending = as.vector(m)
)
ggplot(exp_long, aes(x = year, y = spending, fill = category)) +
geom_area(position = "fill") +
scale_fill_viridis_d() +
theme_minimal()
library(ggplot2)
m <- USPersonalExpenditure
exp_long <- data.frame(
year = as.numeric(rep(colnames(m), each = nrow(m))),
category = rep(rownames(m), times = ncol(m)),
spending = as.vector(m)
)
ggplot(exp_long, aes(x = year, y = spending, fill = category)) +
geom_area(position = "fill") +
scale_fill_viridis_d() +
theme_minimal()Vous voulez ombrer une bande de confiance entre une valeur inférieure et une valeur supérieure autour d’une courbe ajustée. Quel geom utilisez-vous ?
geom_area()geom_ribbon()geom_line()B — geom_ribbon(). Il remplit entre ymin et ymax, ce qui est exactement ce dont une bande de confiance a besoin. geom_area() ne peut remplir que jusqu’à zéro, et geom_line() ne trace aucun remplissage du tout.
Vous avez construit un graphique en aires ggplot2 de A à Z : une simple bande remplie, une aire avec une courbe par-dessus, un remplissage/couleur/transparence personnalisés, un graphique en aires empilées par groupe, une vue proportionnelle (100 %) avec position = "fill", des aires superposées avec position = "identity", des petits multiples en facettes, une densité ombrée et une bande d’incertitude avec geom_ribbon(). Ensuite, explorez le graphique en courbes sur lequel il s’appuie, ou le graphique de densité pour les distributions.
Vous préférez un livre ? GGPlot2 Essentials est disponible en PDF téléchargeable — toutes les leçons de cette série, hors ligne et à vous.
Prouvez que vous savez le faire. Maîtrisez toute la série ggplot2 — 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 : 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 = {Graphique en aires avec R : le guide ggplot2},
date = {2026-07-12},
url = {https://www.datanovia.com/learn/data-visualization/ggplot2/area-plot},
langid = {fr}
}