Pourcentages et valeurs avec ggplot2
Une page de ce site traite des barres empilées avec R. Le mode d’emploi détaille quelques options.
Données
Voici le graphique réalisé par défaut avec ggplot2. Données et script se trouvent en page de barres empilées avec R :

Ajout des valeurs
Avec ggplot2, il est facile d'afficher les montants dans les barres :
ggplot(
ventes_long,
aes(
x = Trimestre,
y = Ventes,
fill = Produit
)
) +
geom_col() +
geom_text(
aes(label = Ventes),
position = position_stack(vjust = 0.5)
) +
theme_minimal()
Quelques explications :
L'instruction geom_col() construit le diagramme à barres empilées. Pour afficher les valeurs numériques, on ajoute une nouvelle couche avec geom_text(). Cette fonction ne crée pas un nouveau graphique mais superpose un texte au graphique déjà construit.
L’argument aes(label = Ventes) indique que chaque étiquette doit afficher la valeur de la variable Ventes. Les valeurs sont donc écrites directement sur les segments.
Si l'on s'arrêtait là, toutes les étiquettes seraient dessinées au sommet de chacun d’eux, ce qui rendrait le graphique difficile à lire. C'est pourquoi on utilise l'argument position = position_stack(vjust = 0.5). La fonction position_stack() permet d'empiler les étiquettes de la même façon que les rectangles de geom_col().
Le paramètre vjust = 0.5 contrôle la position verticale des textes à l'intérieur de chaque segment.
- vjust = 0 place le texte près du bord inférieur,
- vjust = 0.5 le centre dans le segment (plus esthétique !),
- vjust = 1 le rapproche du bord supérieur.
On retrouve ici un principe de ggplot2 : le graphique est construit par addition de couches. La première dessine les barres et la seconde ajoute les valeurs.
Barres empilées en pourcentage
Pour comparer les proportions plutôt que les montants :
ggplot(
ventes_long,
aes(
x = Trimestre,
y = Ventes,
fill = Produit
)
) +
geom_col(position = "fill") +
scale_y_continuous(labels = scales::percent) +
theme_minimal()
Chaque barre représente alors \(100\,\%\) des ventes du trimestre et les segments indiquent la part relative de chaque gamme de produits.
Une ligne change : geom_col(position = "fill")
Quant à la ligne suivante, scale_y_continuous(labels = scales::percent), elle sert à afficher des pourcentages sur l’axe vertical (\(25\,%\) plutôt que 0.25).
Synthèse
Pour terminer, nous souhaitons ajouter aux barres en pourcentage des étiquettes avec une décimale (en blanc : theme_bw()). Nous avons aussi demandé de changer les couleurs des segments.
Pour afficher les pourcentages, il faut procéder à un petit calcul préalable. En effet, lorsque position = "fill" normalise les barres, la variable Ventes contient toujours les valeurs absolues. Le plus simple est de préparer les données avec dplyr, puis d'utiliser geom_text().
library(dplyr)
library(ggplot2)
ventes_long %>%
group_by(Trimestre) %>%
mutate(
Pourcentage = Ventes / sum(Ventes),
Etiquette = sprintf("%.1f %%", 100 * Pourcentage)
) %>%
ggplot(aes(x = Trimestre,
y = Ventes,
fill = Produit)) +
geom_col(position = "fill") +
geom_text(aes(label = Etiquette),
position = position_fill(vjust = 0.5),
color = "white",
size = 4) +
scale_y_continuous(labels = scales::percent) +
scale_fill_manual(values = c(
"Informatique" = "#4E79A7",
"Téléphonie" = "#F28E2B",
"Accessoires" = "#59A14F"
)) +
labs(
title = "Répartition des ventes par trimestre",
x = "Trimestre",
y = "Part des ventes",
fill = "Produit"
) +
theme_bw()

Pour les étiquettes, c’est sprintf() qui met en forme les nombres :
- %.1f : une décimale,
- %% : affiche le caractère %.
