Graphique en barres empilées avec Python
La bibliothèque Matplotlib de Python permet de réaliser plusieurs types de graphiques. À partir d’un exemple qui trouverait sa place dans un tableau de bord des recrutements ou dans la section mouvements d’effectifs du bilan social, nous verrons ici comment construire un graphe en barres empilées.
Données
Soit un fichier Excel (matplotlib.xlsx) qui recense les recrutements réalisés sur trois années.
| Date embauche | Matricule | Catégorie |
| 01/02/2024 | 1563 | Ouvrier |
| 01/03/2024 | 2610 | Employé |
| 01/03/2024 | 4088 | Cadre |
| 01/05/2024 | 1564 | Ouvrier |
| 01/06/2024 | 3114 | AM |
| 01/10/2024 | 1565 | Ouvrier |
| 01/01/2025 | 4089 | Cadre |
| 01/05/2025 | 1566 | Ouvrier |
| 01/06/2025 | 1567 | Ouvrier |
| 01/10/2025 | 4090 | Cadre |
| 01/10/2025 | 3115 | AM |
| 01/02/2026 | 2611 | Employé |
| 01/02/2026 | 4091 | Cadre |
| 01/02/2026 | 1568 | Ouvrier |
| 01/04/2026 | 1569 | Ouvrier |
| 01/05/2026 | 2612 | Employé |
| 01/07/2026 | 3116 | AM |
| 01/09/2026 | 4092 | Cadre |
| 01/09/2026 | 1570 | Ouvrier |
| 01/10/2026 | 3117 | AM |

Réalisons un graphique à partir de ces données.
Importations
Nous devons importer les données, bien sûr, mais aussi Matplotlib et pandas. En effet, c’est grâce à pandas que le fichier Excel sera lu et que le regroupement des dates en années sera réalisable.
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel("matplotlib.xlsx")
pd.read_excel() lit le fichier Excel et crée un dataframe.
Transformation des dates
On utilise pd.to_datetime() :
df["Date embauche"] = pd.to_datetime(
df["Date embauche"],
dayfirst=True
)
L'argument dayfirst=True est important car les dates du fichier sont au format français jour/mois/année. On peut maintenant extraire l'année.
df["Année"] = df["Date embauche"].dt.year
De même que dt.year extrait l’année, dt.month aurait extrait le mois et dt.day aurait extrait le jour.
Préparation du graphique
Utilisons la fonction groupby().
effectifs = df.groupby(["Année", "Catégorie"]).size()
.groupby(["Année", "Catégorie"]) signifie « regroupe les observations qui ont la même année et la même catégorie » puis .size() compte le nombre d'observations dans chaque groupe.
On obtient une Series à deux niveaux d’index. Si l’on demande l’affichage avec print(effectifs) :

Mais pour construire le graphique, il est beaucoup plus pratique d'avoir les années en lignes et les catégories en colonnes. Complétons notre ligne de code avec unstack() :
effectifs = df.groupby(["Année", "Catégorie"]).size().unstack(fill_value=0)

Le fill_value=0 est important. En 2025, par exemple, aucun employé n'a été recruté. Sans cette option, pandas pourrait indiquer NaN (Not a Number).
Construction du graphique
ax = effectifs.plot(
kind="bar",
stacked=True,
figsize=(8, 5)
)
plt.show()
kind="bar" indique que l'on veut un graphique en barres et stacked=True demande à pandas de superposer les catégories à l'intérieur de chaque barre. figsize=(8, 5) définit la taille de la figure (la largeur est de 8 pouces et la hauteur de 5 pouces). On obtient le graphique ci-dessous (les marges ont été rognées pour votre confort au cas où votre écran serait très petit).

