Personnalisation d'un graphique avec Python
Les améliorations qui peuvent être apportées à un graphique ne sont pas qu’esthétiques. Elles rendent l’information plus percutante. Un manageur pressé peut tout à fait passer à côté d’un fait important qu’un graphique n’a pas suffisamment mis en valeur (titre ambigu, lecture difficile, échelle inappropriée…).
Lorsqu’on construit un graphique avec la bibliothèque Matplotlib de Python, il ne faut donc pas oublier quelques instructions pour obtenir un résultat parlant.
Point de départ
Nous travaillerons sur un graphique montrant l’évolution de recrutements dans une entreprise. Les données et le script se trouvent en page de barres empilées avec Matplotlib. Ils ont permis de tracer ce graphique très basique, que nous améliorerons.

Améliorations
fig, ax = plt.subplots(figsize=(8, 5))
Cette instruction crée la figure et l'axe qui vont recevoir le graphique. On peut ensuite agir directement sur ax, comme nous le verrons à plusieurs reprises. Quant à figsize, c’est l’instruction qui donne les dimensions, hélas en pouces. La largeur est de 8 pouces et la hauteur de 5 pouces.
effectifs.plot(kind="bar", stacked=True, ax=ax)
ax.set_title("Recrutements par catégorie socioprofessionnelle",
fontsize=14,
fontweight="bold")
ax.set_xlabel("Année d'embauche")
ax.set_ylabel("Nombre de recrutements")
ax.legend(
title="Catégorie",
title_fontsize=10,
loc="upper left",
bbox_to_anchor=(1, 1)
)
Ces instructions n’appellent pas d’explications détaillées : texte, taille et fonte du titre, libellés des axes, intitulé, taille et emplacement de la légende.
ax.grid(axis="y", linestyle="--", alpha=0.4)
Cette instruction ajoute une grille horizontale (axis="y") en pointillés. alpha=0.4 signifie une transparence de \(60\,\%.\) D’ailleurs, alpha ne s’applique pas seulement aux grilles mais aussi aux barres elles-mêmes et surtout aux points d’un nuages de points, ceux-ci apparaissant alors plus foncés en cas de superposition.
plt.xticks(rotation=0)
Matplotlib peut afficher les années légèrement inclinées. Ici ce n'est pas nécessaire puisque les étiquettes sont très courtes.
plt.tight_layout()
plt.show()

Étiquettes
Il est souvent plus parlant d’intégrer des étiquettes aux segments.
for container in ax.containers:
ax.bar_label(
container,
label_type="center",
fontsize=9,
bbox=dict(facecolor="white", edgecolor="gray", boxstyle="round, pad=0.2")
)
ax.bar_label(container, label_type="center"
L’instruction bbox est celle qui enjolive les étiquettes : ici, elles auront un fond blanc, des bords gris, des coins arrondis et une distance de 0,2 entre le chiffre et le bord de l’étiquette.
Réordonnancement
Vous l’avez peut-être remarqué, l’ordre des segments est alphabétique. Supposons que l’on préfère représenter les ouvriers en bas, puis les employés, puis les agents de maîtrise et enfin les cadres au sommet.
Cette opération doit être préparée en amont du script présenté sur cette page puisque ce n’est pas Matplotlib qui décide de l’ordre des catégories. Il suffit de réordonner les colonnes après la fonction unstack() (voir les barres empilées avec Matplotlib).
effectifs = (
df.groupby(["Année", "Catégorie"])
.size()
.unstack(fill_value=0)
)
effectifs = effectifs[["Ouvrier", "Employé", "AM", "Cadre"]]
Présentons à présent le graphique en barres empilées avec les étiquettes et le réordonnancement des segments :

Remarquez l’étiquette gênante avec un zéro au bas de l’année 2025. Le plus simple est de ne fournir une étiquette que lorsque la valeur est différente de zéro. À intégrer dans la boucle for :
labels = [str(v) if v != 0 else "" for v in container.datavalues]
Changements de couleurs
Dans effectifs.plot(), ajoutez par exemple color=["#A8C4D8", "#F4C6A6", "#B8D8BA", "#D9B8C4"]. Vous pouvez voir le résultat en page de tableau de bord des recrutements !
