Cours de Python / Visualiser des résultats avec Matplotlib et enregistrer un graphique
Matplotlib permet de créer un graphique en indiquant les données, les axes et les libellés. Pour comparer deux totaux de dépenses, un diagramme en barres avec une unité explicite et un axe commençant à zéro montre directement la différence ; cet exercice enregistre le résultat dans un fichier, sans ouvrir de fenêtre.
Choisir la comparaison et préparer l’environnement
Les deux nombres sont les totaux par catégorie : food=11500 et transport=2500, exprimés en wons coréens (KRW). Le graphique ne corrige pas un calcul erroné et ne révèle pas, à lui seul, les lignes rejetées pendant l’importation. Vérifiez les sommes, les unités et les données absentes avant de les représenter, comme dans le cours sur l’agrégation avec pandas.
Une barre convient ici à la comparaison de catégories distinctes. Une évolution dans le temps demanderait plutôt des dates ordonnées et une représentation adaptée à cette question. N’ajoutez pas une ligne entre des catégories sans ordre simplement parce que la bibliothèque sait la tracer.
Dans l’environnement virtuel de votre projet, installez Matplotlib avec un interpréteur et une version compatibles :
python -m pip install matplotlib
Les instructions officielles de démarrage Matplotlib précisent l’installation. Utilisez le même environnement pour exécuter le fichier ; si l’import échoue, contrôlez cet environnement avant de réinstaller le paquet ailleurs.
Exécuter le programme complet et enregistrer l’image
Créez un dossier d’exercice neuf, car l’enregistrement remplace un fichier expense-chart.png de même nom. Enregistrez le programme suivant en UTF-8 dans chart.py. Cette première version garde les noms de catégories et les libellés anglais ; leur adaptation en français est expliquée plus bas.
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
plt.rcParams.update({"font.size": 18, "axes.titlesize": 22, "axes.labelsize": 20, "xtick.labelsize": 18, "ytick.labelsize": 18})
categories = ["food", "transport"]
amounts = [11500, 2500]
fig, ax = plt.subplots(figsize=(7, 4), layout="constrained")
bars = ax.bar(categories, amounts, color=["#2b6cb0", "#d69e2e"])
ax.set_ylabel("Amount (KRW)")
ax.set_title("Expenses by category")
ax.set_ylim(0, max(amounts) * 1.2)
ax.bar_label(bars, fmt="%.0f", padding=3)
fig.savefig("expense-chart.png", dpi=160)
plt.close(fig)
print("saved expense-chart.png")
Dans le terminal de ce dossier avec l’environnement sélectionné, lancez python chart.py. Sous macOS ou Ubuntu, adaptez la commande en python3 si c’est le nom de votre interpréteur hors environnement virtuel. Le message attendu est :
saved expense-chart.png
Le fichier doit être présent dans le dossier courant. Avec une figure de 7 × 4 pouces enregistrée à 160 points par pouce, l’image fait 1 120 × 640 pixels. Le message de réussite indique que l’enregistrement s’est terminé ; ouvrez tout de même l’image pour contrôler les libellés et les valeurs.
ax.bar construit les deux barres ; bar_label affiche leurs valeurs sans décimales. La limite supérieure laisse 20 % d’espace au-dessus de la valeur maximale, tandis que la limite inférieure est fixée à zéro. Le code illustre ces deux valeurs positives connues : si vous le généralisez à des valeurs négatives, vides ou toutes nulles, définissez aussi la validation et les limites d’axe appropriées.
Distinguer la figure, les axes et le moteur de rendu
La Figure représente l’ensemble de l’image ; l’objet Axes contient la zone où sont dessinées les coordonnées, les barres et leurs libellés. Les références explicites fig et ax permettent de savoir quel graphique modifier si vous en créez plusieurs.
Le moteur de rendu, ou backend, choisit notamment comment afficher ou enregistrer la figure. Agg produit des images sans interface graphique ; l’appel matplotlib.use("Agg") est placé avant l’import de pyplot. Cette solution convient à un rapport automatisé. La documentation des backends distingue les possibilités interactives et l’écriture de fichiers.
Pour une fenêtre sur un ordinateur disposant d’un backend graphique, retirez la sélection de Agg et insérez plt.show() après fig.savefig(...) mais avant plt.close(fig). Un serveur sans interface graphique ne possède pas nécessairement les composants requis. Conservez la fermeture des figures dans les traitements répétés afin de libérer les ressources utilisées.
Adapter les libellés et choisir une police pour le français
Pour la variante française, remplacez la liste de catégories par ["alimentation", "transport"], le titre par "Dépenses par catégorie" et le libellé vertical par "Montant (KRW)". Gardez les montants, la ligne de base et les dimensions inchangés : traduire les textes ne doit pas modifier les hauteurs des barres.
Une police doit contenir tous les caractères utilisés, notamment les accents. Pour la figure française ci-dessous, le fichier Noto Sans a été chargé explicitement et la police résolue par Matplotlib a été vérifiée. Une police couvrant le français ne couvre pas nécessairement le coréen ou le japonais.
Le bloc suivant montre comment charger un fichier de police : son chemin Windows d’exemple correspond à Malgun Gothic. Adaptez font_path à un fichier réellement présent sur votre machine ; pour reproduire la variante française, choisissez votre fichier Noto Sans. Placez ce bloc après l’import de pyplot sous le nom plt et avant la création de fig.
from matplotlib import font_manager
font_path = "C:/Windows/Fonts/malgun.ttf"
font_manager.fontManager.addfont(font_path)
plt.rcParams["font.family"] = font_manager.FontProperties(fname=font_path).get_name()
plt.rcParams["axes.unicode_minus"] = False
Vérifiez l’existence du fichier et ses conditions d’utilisation ; un chemin absent provoquera une erreur. addfont enregistre le fichier auprès du gestionnaire de cette session, puis FontProperties(...).get_name() fournit son nom interne pour la configuration. Consultez la référence de FontProperties et du gestionnaire de polices pour ces opérations.
Voici le résultat réellement enregistré après les remplacements français et l’application de Noto Sans. Les valeurs restent 11 500 et 2 500 KRW sur le même axe commençant à zéro :
Contrôler la lisibilité et conserver les versions
- Ouvrez
expense-chart.pnget contrôlez les deux barres, les étiquettes11500et2500, l’unité KRW et le départ de l’axe à zéro. - Dans une copie de l’exercice, réduisez seulement
figsize=(7, 4)àfigsize=(4, 4). Examinez les textes : un titre long peut dépasser la largeur disponible même aveclayout="constrained". Les mêmes données ne garantissent pas une mise en page lisible à toute taille. - Rétablissez
figsize=(7, 4), régénérez l’image et confirmez que les libellés ne sont plus coupés. Vérifiez aussi le résultat réduit à la largeur d’un téléphone ; si nécessaire, ajustez les dimensions ou le texte sans déformer la comparaison.
savefig peut enregistrer plusieurs formats selon l’extension et ses paramètres ; sa référence officielle décrit la résolution et les options. Pour garder un historique, utilisez des noms de fichiers distincts avec une date ou un identifiant d’exécution. Ne comptez pas sur l’écrasement du fichier pour conserver l’état précédent.
Une comparaison doit rester fidèle aux nombres : ne tronquez pas l’axe des barres pour exagérer la différence et n’utilisez pas une surface décorative qui contredit leurs valeurs. Des libellés lisibles, une unité explicite et les chiffres affichés rendent le graphique contrôlable par le lecteur.





