Formatage des graphiques monétaires avec Matplotlib

Beginner

This tutorial is from open-source community. Access the source code

Introduction

Lorsque vous visualisez des données financières, il est essentiel de formater correctement les axes avec des symboles monétaires. Matplotlib est une bibliothèque Python puissante pour créer des visualisations, mais par défaut, elle n'affiche pas de symboles monétaires sur les axes.

Dans ce labo, nous allons apprendre à personnaliser un graphique Matplotlib pour afficher des signes dollars sur les étiquettes de l'axe des ordonnées (y-axis). Cette compétence est précieuse lorsqu'on travaille avec des données financières, des chiffres de vente, des budgets ou tout autre ensemble de données nécessitant un formatage monétaire.

Conseils pour la machine virtuelle (VM)

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Notebook afin d'accéder à Jupyter Notebook pour pratiquer.

click-notebook

Vous devrez peut-être attendre quelques secondes que Jupyter Notebook ait terminé de charger. La validation des opérations ne peut pas être automatisée en raison des limitations de Jupyter Notebook.

Si vous rencontrez des problèmes pendant le labo, n'hésitez pas à demander de l'aide à Labby. Veuillez nous donner votre feedback après la session, et nous résoudrons rapidement tous les problèmes pour vous.

Configuration des bibliothèques et création de données d'exemple

Dans cette première étape, nous allons importer les bibliothèques nécessaires et créer des données financières d'exemple pour notre graphique. Nous devons importer à la fois Matplotlib pour la visualisation et NumPy pour la génération de données.

Dans la première cellule de votre notebook, entrez et exécutez le code suivant pour importer les bibliothèques requises :

## Import necessary libraries
import matplotlib.pyplot as plt
import numpy as np

## Display plots inline in the notebook
%matplotlib inline

print("Libraries imported successfully!")

Après avoir exécuté le code (appuyez sur Shift+Enter), vous devriez voir la sortie suivante :

Libraries imported successfully!

libraries-imported

Maintenant, créons des données financières d'exemple à visualiser. Les données financières représentent souvent des valeurs au fil du temps, nous allons donc créer un simple ensemble de données qui pourrait représenter le chiffre d'affaires quotidien sur une période donnée.

Dans une nouvelle cellule, ajoutez et exécutez le code suivant :

## Set a random seed for reproducibility
np.random.seed(42)

## Generate financial data: 30 days of revenue data
days = np.arange(1, 31)
daily_revenue = np.random.uniform(low=1000, high=5000, size=30)

print("Sample of daily revenue data (first 5 days):")
for i in range(5):
    print(f"Day {days[i]}: ${daily_revenue[i]:.2f}")

Après avoir exécuté ce code, vous verrez les 5 premiers jours de nos données de chiffre d'affaires d'exemple :

Sample of daily revenue data (first 5 days):
Day 1: $3745.40
Day 2: $3992.60
Day 3: $2827.45
Day 4: $4137.54
Day 5: $1579.63

Ces données d'exemple représentent les valeurs de chiffre d'affaires quotidien entre 1 000 $ et 5 000 $ sur une période de 30 jours. Nous utiliserons ces données pour créer notre graphique à l'étape suivante.

Création d'un graphique financier de base

Maintenant que nos données sont prêtes, créons un graphique de base pour visualiser le chiffre d'affaires quotidien. Nous allons commencer par un simple graphique linéaire qui montre la tendance du chiffre d'affaires sur la période de 30 jours.

Dans une nouvelle cellule de votre notebook, ajoutez et exécutez le code suivant :

## Create a figure and axes
fig, ax = plt.subplots(figsize=(10, 6))

## Plot the daily revenue data
ax.plot(days, daily_revenue, marker='o', linestyle='-', color='blue', linewidth=2, markersize=6)

## Add labels and title
ax.set_xlabel('Day', fontsize=12)
ax.set_ylabel('Revenue', fontsize=12)
ax.set_title('Daily Revenue Over 30 Days', fontsize=14, fontweight='bold')

## Add grid for better readability
ax.grid(True, linestyle='--', alpha=0.7)

## Display the plot
plt.tight_layout()
plt.show()

print("Basic plot created successfully!")

Après avoir exécuté ce code, vous devriez voir un graphique linéaire montrant la tendance du chiffre d'affaires quotidien. Il devrait ressembler à ceci (les valeurs réelles peuvent varier légèrement en raison de la génération aléatoire) :

Basic Revenue Plot

Analysons ce que nous avons fait dans ce code :

  1. fig, ax = plt.subplots(figsize=(10, 6)) - Nous avons créé une figure et des axes d'une taille de 10×6 pouces.
  2. ax.plot(days, daily_revenue, ...) - Nous avons tracé nos données avec les jours sur l'axe des abscisses (x-axis) et le chiffre d'affaires sur l'axe des ordonnées (y-axis).
  3. ax.set_xlabel(), ax.set_ylabel(), ax.set_title() - Nous avons ajouté des étiquettes et un titre à notre graphique.
  4. ax.grid() - Nous avons ajouté une grille pour faciliter la lecture des données.
  5. plt.tight_layout() - Nous avons ajusté le remplissage pour que tout s'adapte correctement.
  6. plt.show() - Nous avons affiché le graphique.

Notez que l'axe des ordonnées affiche actuellement des nombres simples sans signes dollars. Dans l'étape suivante, nous allons modifier notre graphique pour afficher un formatage monétaire approprié sur l'axe des ordonnées.

Mise en forme des étiquettes de l'axe des ordonnées (y-axis) avec des signes dollars

Maintenant que nous avons notre graphique de base, formattons les étiquettes de l'axe des ordonnées pour afficher des signes dollars. Cela rendra nos données financières plus lisibles et présentées de manière plus professionnelle.

Pour formater les étiquettes des graduations sur l'axe des ordonnées, nous allons utiliser le module ticker de Matplotlib, qui propose diverses options de formatage. Plus précisément, nous allons utiliser la classe StrMethodFormatter pour créer un formateur personnalisé pour notre axe des ordonnées.

Dans une nouvelle cellule de votre notebook, ajoutez et exécutez le code suivant :

## Import the necessary module for formatting
import matplotlib.ticker as ticker

## Create a figure and axes
fig, ax = plt.subplots(figsize=(10, 6))

## Plot the daily revenue data
ax.plot(days, daily_revenue, marker='o', linestyle='-', color='blue', linewidth=2, markersize=6)

## Format y-axis with dollar signs
formatter = ticker.StrMethodFormatter('${x:,.2f}')
ax.yaxis.set_major_formatter(formatter)

## Add labels and title
ax.set_xlabel('Day', fontsize=12)
ax.set_ylabel('Revenue ($)', fontsize=12)
ax.set_title('Daily Revenue Over 30 Days', fontsize=14, fontweight='bold')

## Add grid for better readability
ax.grid(True, linestyle='--', alpha=0.7)

## Display the plot
plt.tight_layout()
plt.show()

print("Plot with dollar-formatted y-axis created!")

Après avoir exécuté ce code, vous devriez voir un nouveau graphique avec des signes dollars sur les étiquettes de l'axe des ordonnées.

Expliquons la partie clé de ce code :

formatter = ticker.StrMethodFormatter('${x:,.2f}')
ax.yaxis.set_major_formatter(formatter)

Voici ce que fait cette chaîne de formatage :

  • $ - Ajoute un signe dollar au début de chaque étiquette
  • {x:,.2f} - Formate le nombre avec :
    • , - Une virgule comme séparateur de milliers (par exemple, 1 000 au lieu de 1000)
    • .2f - Deux décimales (par exemple, $1 234,56)

Ce formateur s'applique à toutes les étiquettes de graduation principales sur l'axe des ordonnées. Remarquez comment le graphique indique désormais clairement que les valeurs sont en dollars, ce qui le rend beaucoup plus adapté à la visualisation de données financières.

Amélioration du graphique pour une meilleure visualisation des données financières

Maintenant que nous avons mis en place le formatage monétaire de base, améliorons notre graphique pour le rendre plus utile à l'analyse des données financières. Nous allons apporter plusieurs améliorations :

  1. Une ligne horizontale montrant le chiffre d'affaires quotidien moyen
  2. Des annotations mettant en évidence les jours de chiffre d'affaires maximum et minimum
  3. Des paramètres de graduation personnalisés pour une meilleure lisibilité
  4. Un titre et une légende plus descriptifs

Dans une nouvelle cellule de votre notebook, ajoutez et exécutez le code suivant :

## Import the necessary module for formatting
import matplotlib.ticker as ticker

## Create a figure and axes
fig, ax = plt.subplots(figsize=(12, 7))

## Plot the daily revenue data
ax.plot(days, daily_revenue, marker='o', linestyle='-', color='blue',
        linewidth=2, markersize=6, label='Daily Revenue')

## Calculate statistics
avg_revenue = np.mean(daily_revenue)
max_revenue = np.max(daily_revenue)
min_revenue = np.min(daily_revenue)
max_day = days[np.argmax(daily_revenue)]
min_day = days[np.argmin(daily_revenue)]

## Add a horizontal line for average revenue
ax.axhline(y=avg_revenue, color='r', linestyle='--', alpha=0.7,
           label=f'Average Revenue: ${avg_revenue:.2f}')

## Format y-axis with dollar signs
formatter = ticker.StrMethodFormatter('${x:,.2f}')
ax.yaxis.set_major_formatter(formatter)

## Customize tick parameters
ax.tick_params(axis='both', which='major', labelsize=10)
ax.yaxis.set_major_locator(ticker.MaxNLocator(nbins=10))
ax.xaxis.set_major_locator(ticker.MultipleLocator(base=5))

## Add annotations for max and min revenue
ax.annotate(f'Max: ${max_revenue:.2f}', xy=(max_day, max_revenue),
            xytext=(max_day+1, max_revenue+200),
            arrowprops=dict(facecolor='black', shrink=0.05, width=1.5))

ax.annotate(f'Min: ${min_revenue:.2f}', xy=(min_day, min_revenue),
            xytext=(min_day+1, min_revenue-200),
            arrowprops=dict(facecolor='black', shrink=0.05, width=1.5))

## Add labels and title
ax.set_xlabel('Day of Month', fontsize=12)
ax.set_ylabel('Revenue ($)', fontsize=12)
ax.set_title('Daily Revenue Analysis - 30 Day Period', fontsize=14, fontweight='bold')

## Set x-axis limits to show a bit of padding
ax.set_xlim(0, 31)

## Add grid for better readability
ax.grid(True, linestyle='--', alpha=0.7)

## Add legend
ax.legend(loc='upper right', fontsize=10)

## Display the plot
plt.tight_layout()
plt.show()

print("Enhanced financial plot created successfully!")

Après avoir exécuté ce code, vous devriez voir un graphique beaucoup plus informatif avec :

  1. Un formatage avec des signes dollars sur l'axe des ordonnées
  2. Une ligne horizontale en pointillés rouge montrant le chiffre d'affaires moyen
  3. Des annotations pointant vers les jours de chiffre d'affaires maximum et minimum
  4. Des graduations plus claires avec un meilleur espacement
  5. Une légende indiquant ce que chaque élément représente

Expliquons certains des nouveaux éléments :

  • ax.axhline() - Ajoute une ligne horizontale à la valeur y spécifiée (dans ce cas, notre chiffre d'affaires moyen)
  • ax.yaxis.set_major_locator() - Contrôle le nombre de graduations qui apparaissent sur l'axe des ordonnées
  • ax.xaxis.set_major_locator() - Configure l'axe des abscisses pour afficher des graduations à intervalles de 5 jours
  • ax.annotate() - Ajoute des annotations textuelles avec des flèches pointant vers des points de données spécifiques
  • ax.legend() - Ajoute une légende expliquant les différents éléments du graphique

Ces améliorations rendent le graphique beaucoup plus utile pour l'analyse financière en mettant en évidence les statistiques clés et en rendant les données plus faciles à interpréter.

Enregistrement du graphique et création d'une fonction réutilisable

Dans cette étape finale, nous allons créer une fonction réutilisable pour générer des graphiques formatés en devise et enregistrer notre visualisation dans un fichier. Cette approche facilite l'application du même formatage à différents ensembles de données financières à l'avenir.

Dans une nouvelle cellule de votre notebook, ajoutez et exécutez le code suivant :

def create_currency_plot(x_data, y_data, title='Financial Data',
                         xlabel='X-Axis', ylabel='Amount ($)',
                         filename=None, show_stats=True):
    """
    Create a plot with currency formatting on the y-axis.

    Parameters:
    -----------
    x_data : array-like
        Data for the x-axis
    y_data : array-like
        Data for the y-axis (currency values)
    title : str
        Title of the plot
    xlabel : str
        Label for the x-axis
    ylabel : str
        Label for the y-axis
    filename : str, optional
        If provided, save the plot to this filename
    show_stats : bool
        Whether to show statistics (average, min, max)

    Returns:
    --------
    fig, ax : tuple
        The figure and axes objects
    """
    ## Import the necessary module for formatting
    import matplotlib.ticker as ticker

    ## Create a figure and axes
    fig, ax = plt.subplots(figsize=(12, 7))

    ## Plot the data
    ax.plot(x_data, y_data, marker='o', linestyle='-', color='blue',
            linewidth=2, markersize=6, label='Data')

    if show_stats:
        ## Calculate statistics
        avg_value = np.mean(y_data)
        max_value = np.max(y_data)
        min_value = np.min(y_data)
        max_x = x_data[np.argmax(y_data)]
        min_x = x_data[np.argmin(y_data)]

        ## Add a horizontal line for average value
        ax.axhline(y=avg_value, color='r', linestyle='--', alpha=0.7,
                   label=f'Average: ${avg_value:.2f}')

        ## Add annotations for max and min values
        ax.annotate(f'Max: ${max_value:.2f}', xy=(max_x, max_value),
                    xytext=(max_x+1, max_value+200),
                    arrowprops=dict(facecolor='black', shrink=0.05, width=1.5))

        ax.annotate(f'Min: ${min_value:.2f}', xy=(min_x, min_value),
                    xytext=(min_x+1, min_value-200),
                    arrowprops=dict(facecolor='black', shrink=0.05, width=1.5))

    ## Format y-axis with dollar signs
    formatter = ticker.StrMethodFormatter('${x:,.2f}')
    ax.yaxis.set_major_formatter(formatter)

    ## Customize tick parameters
    ax.tick_params(axis='both', which='major', labelsize=10)

    ## Add labels and title
    ax.set_xlabel(xlabel, fontsize=12)
    ax.set_ylabel(ylabel, fontsize=12)
    ax.set_title(title, fontsize=14, fontweight='bold')

    ## Add grid for better readability
    ax.grid(True, linestyle='--', alpha=0.7)

    ## Add legend
    if show_stats:
        ax.legend(loc='best', fontsize=10)

    ## Adjust layout
    plt.tight_layout()

    ## Save the plot if filename is provided
    if filename:
        plt.savefig(filename, dpi=300, bbox_inches='tight')
        print(f"Plot saved as '{filename}'")

    return fig, ax

## Use our function to create and save a plot
fig, ax = create_currency_plot(
    days,
    daily_revenue,
    title='Monthly Revenue Report',
    xlabel='Day of Month',
    ylabel='Daily Revenue ($)',
    filename='revenue_plot.png'
)

## Display the plot
plt.show()

print("Function created and plot saved successfully!")

Après avoir exécuté ce code, vous devriez voir :

  1. Un graphique similaire à celui que nous avons créé à l'étape précédente, mais généré à l'aide de notre fonction personnalisée
  2. Un message confirmant que le graphique a été enregistré dans un fichier nommé revenue_plot.png

La fonction que nous avons créée :

  • Prend en compte les données pour les axes x et y
  • Permet de personnaliser les étiquettes et le titre
  • Offre la possibilité d'enregistrer le graphique dans un fichier
  • Peut afficher ou masquer des statistiques telles que la moyenne, le minimum et le maximum
  • Renvoie les objets figure et axes pour une personnalisation supplémentaire si nécessaire

Cette fonction réutilisable facilite la création de graphiques financiers formatés de manière cohérente à l'avenir. Vous pouvez simplement appeler cette fonction avec différents ensembles de données, et elle gérera automatiquement tout le formatage monétaire et les annotations statistiques.

Pour vérifier que notre graphique a été enregistré correctement, vérifions si le fichier existe :

import os
if os.path.exists('revenue_plot.png'):
    print("Plot file exists! Size:", os.path.getsize('revenue_plot.png'), "bytes")
else:
    print("Plot file was not saved correctly.")

Vous devriez voir un message confirmant que le fichier existe et indiquant sa taille.

Félicitations ! Vous avez appris avec succès à formater des graphiques avec des signes dollars et à créer des visualisations financières de qualité professionnelle à l'aide de Matplotlib.

Résumé

Dans ce laboratoire (lab), nous avons appris à créer des graphiques financiers avec un formatage monétaire approprié à l'aide de Matplotlib. Nous avons abordé plusieurs concepts importants :

  1. Génération et manipulation de données financières d'exemple
  2. Création de graphiques de base avec Matplotlib
  3. Formatage des étiquettes de l'axe des ordonnées avec des signes dollars à l'aide de la classe StrMethodFormatter
  4. Amélioration des graphiques avec des statistiques, des annotations et un style amélioré
  5. Création d'une fonction réutilisable pour générer des graphiques formatés en devise de manière cohérente

Ces compétences sont essentielles pour tous ceux qui travaillent avec la visualisation de données financières, car elles vous permettent de créer des graphiques professionnels et informatifs qui communiquent clairement les valeurs monétaires.

Les techniques que vous avez apprises peuvent être appliquées à divers ensembles de données financières tels que :

  • Rapports de ventes et de chiffre d'affaires
  • Analyse budgétaire
  • Suivi des performances d'investissement
  • Analyse des coûts
  • Suivi des dépenses

En formatant correctement vos axes avec des symboles monétaires, vous rendez vos visualisations plus intuitives et professionnelles, améliorant ainsi l'efficacité de votre communication de données.