Barres empilées avec R base et ggplot2
Les diagrammes à barres empilées permettent de représenter simultanément un total et sa composition. Ils sont particulièrement utiles lorsqu'on souhaite comparer plusieurs groupes tout en conservant le détail de leurs composantes.
Dans ce tutoriel, nous allons représenter les ventes trimestrielles de trois familles de produits à partir d'un fichier Excel, puis construire le même graphique avec les fonctions graphiques de base de R puis avec ggplot2.
Préparation des données
Supposons le fichier Excel ventes.xlsx qui contient les données suivantes :
| Trimestre | Informatique | Téléphonie | Accessoires |
| T1 | 120 | 80 | 40 |
| T2 | 150 | 90 | 50 |
| T3 | 130 | 110 | 60 |
| T4 | 170 | 120 | 70 |
Pour l'importer dans R, nous utiliserons le package readxl :
library(readxl)
ventes <- read_excel("ventes.xlsx")
ventes

Barres empilées avec R de base
La fonction barplot() attend une matrice dont les séries à empiler sont placées en lignes. Nous allons donc extraire les colonnes numériques puis les transposer.
mat <- t(as.matrix(ventes[, 2:4]))
mat

La syntaxe dataframe[, 2:4] est l'une des formes les plus courantes d'indexation en R. La partie située avant la virgule désigne les lignes, celle située après la virgule désigne les colonnes. Lorsqu'une partie est laissée vide, toutes les lignes ou toutes les colonnes sont sélectionnées.
Créons ensuite le graphique :
couleurs <- c("steelblue", "orange", "darkgreen")
barplot(
mat,
col = couleurs,
names.arg = ventes$Trimestre,
main = "Ventes trimestrielles",
xlab = "Trimestre",
ylab = "Montant des ventes",
legend.text = rownames(mat)
)
Ce n’est pas un chef d’œuvre, surtout en raison de l’emplacement de la légende ! Il faudrait retravailler ce graphique mais ce n’est pas notre sujet ici.

Conclusion : le code reste relativement compact, mais il faut préparer les données sous une forme particulière avant de pouvoir les représenter.
Barres empilées avec ggplot2
L'approche de ggplot2 est différente. Les données doivent être placées dans un format long : une colonne contient les catégories de produits et une autre les montants. Nous utiliserons tidyr.
library(tidyr)
ventes_long <- ventes |>
pivot_longer(
cols = Informatique:Accessoires,
names_to = "Produit",
values_to = "Ventes"
)
ventes_long
On obtient :

Cette structure est idéale pour ggplot2.
Construction du graphique :
library(ggplot2)
ggplot(
ventes_long,
aes(
x = Trimestre,
y = Ventes,
fill = Produit
)
) +
geom_col() +
labs(
title = "Ventes trimestrielles",
x = "Trimestre",
y = "Montant des ventes",
fill = "Produit"
) +
theme_minimal()
Le graphique obtenu est similaire au précédent mais il présente un rendu plus attrayant et une légende mieux intégrée.
