Graphique en aires avec R : le guide ggplot2

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

Date de publication

12 juillet 2026

Modifié

12 juillet 2026

AstucePoints clés
  • Un graphique en aires remplit la région entre une courbe et l’axe des x — c’est un graphique en courbes dont l’espace situé en dessous est coloré, tracé avec geom_area().
  • Associez une variable ordonnée (souvent le temps) à x et les valeurs à y ; geom_area() remplit jusqu’à zéro.
  • Superposez geom_line() sur geom_area() pour conserver un bord net sur la bande remplie.
  • Pour plusieurs groupes, associez la variable de regroupement à fillgeom_area() les empile par défaut (le cousin continu du diagramme en barres empilées).
  • Changez la position : "stack" (totaux), "fill" (proportions, 0–1) ou "identity" avec alpha (superposition, pour comparer).
  • Utilisez 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.
Obtenez le livre — GGPlot2 Essentials (PDF)

Introduction

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

Construire un graphique en aires de base

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.

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

ggplot2 area plot of the US personal savings rate over time, filled in brand azure down to the x-axis.

Ajouter une courbe par-dessus

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.

library(ggplot2)
ggplot(economics, aes(x = date, y = psavert)) +
  geom_area(fill = "#3a86d4", alpha = 0.3) +
  geom_line(colour = "#3a86d4", linewidth = 0.8) +
  labs(x = "Date", y = "Personal savings rate (%)") +
  theme_minimal()

ggplot2 area plot of the US personal savings rate with a lighter azure fill and a solid azure line tracing the top edge.

Personnaliser le remplissage, la couleur et la transparence

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.

library(ggplot2)
ggplot(economics, aes(x = date, y = psavert)) +
  geom_area(fill = "#3a86d4", alpha = 0.35,
            colour = "#1f4e79", linetype = "dashed", linewidth = 0.6) +
  labs(x = "Date", y = "Personal savings rate (%)") +
  theme_minimal()

ggplot2 area plot of the savings rate with a light azure fill and a dashed darker-blue border outlining the area.

Graphique en aires empilées par groupe

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

ggplot2 stacked area chart of US personal expenditure by five spending categories from 1940 to 1960, each a viridis-coloured band adding to the total.

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.

Aires empilées proportionnelles (100 %)

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

ggplot2 proportional stacked area chart where each year sums to 1, showing the share of US spending by category from 1940 to 1960.

Comparer des groupes sans empilement

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

ggplot2 area plot of two US spending categories drawn from a common zero baseline with semi-transparent overlapping fills.

Petits multiples avec des facettes

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

ggplot2 faceted area chart with one small panel per US spending category, each showing its own filled trend from 1940 to 1960.

Ombrer l’aire sous une courbe de densité

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

ggplot2 density of Old Faithful waiting times with the whole area lightly filled and the 70-to-90-minute region shaded darker under the curve.

Ajouter une bande d’incertitude avec geom_ribbon

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

ggplot2 plot of a smooth loess trend of the US savings rate with a shaded azure confidence band drawn by geom_ribbon around the line.

Essayez en direct

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.

🟢 Avec un agent IA

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 →

Problèmes fréquents

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

Foire aux questions

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

Testez vos connaissances

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.

# Give geom_area() the position argument that normalises each x to sum to 1.
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 ?

  • A. geom_area()
  • B. geom_ribbon()
  • C. 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.

Conclusion

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.

Leçons connexes

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.

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 ggplot2 — 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 = {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}
}
Veuillez citer ce travail comme suit :
“Graphique en aires avec R : le guide ggplot2.” 2026. July 12. https://www.datanovia.com/learn/data-visualization/ggplot2/area-plot.