Les barres empilées avec Matplotlib

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

embauché

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

série à 2 niveaux

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)

contingence

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

graphique

 

remarque de bon sens