Skip to content

Comment gérer facilement fill_between dans Matplotlib

Updated on

La visualisation des données est autant un art qu'une science. L'un des outils les plus puissants dans l'arsenal d'un data scientist est Matplotlib, une bibliothèque Python polyvalente qui offre une base solide pour créer une grande variété de graphiques, de tracés et de visualisations de données plus complexes. Parmi ses nombreuses fonctionnalités, l'une se distingue par sa capacité unique à mettre en évidence les zones significatives à l'intérieur d'un graphique - la fonction fill_between.

La fonction fill_between peut être utilisée pour remplir la zone entre deux lignes, mais ses capacités vont au-delà des simples remplissages. Avec un peu d'ingéniosité, elle peut être utilisée pour créer des remplissages conditionnels qui mettent en évidence des périodes ou des motifs spécifiques dans vos données. Cet article vise à offrir une explication détaillée et riche sur la manière d'exploiter la puissance de fill_between, pour améliorer vos tracés Matplotlib et surpasser les meilleures ressources disponibles.

Pourquoi fill_between est important dans Matplotlib

La capacité de remplir des zones entre des lignes dans un graphique offre une mise en évidence visuelle qui peut accentuer les différences, les tendances ou les motifs dans vos données. Elle peut être utile pour mettre en évidence des zones clés, guider l'attention du spectateur vers des points de données importants ou simplement ajouter une touche esthétique à vos graphiques. Lorsqu'elle est combinée à des déclarations conditionnelles, elle peut prendre un nouveau niveau d'utilité, permettant des mises en évidence plus nuancées et spécifiques dans vos données.

Remplir entre des lignes: Les bases

Avant de plonger dans les remplissages conditionnels, comprenons comment fill_between fonctionne à un niveau de base. La fonction prend au moins trois arguments:

  1. Les valeurs x: elles définissent les limites horizontales du remplissage.
  2. Les premières valeurs y: elles définissent la limite verticale inférieure.
  3. Les deuxièmes valeurs y: elles définissent la limite verticale supérieure.

Voici un exemple simple:

import matplotlib.pyplot as plt
import numpy as np
 
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
 
plt.plot(x, y1, '-b', label='sinus')
plt.plot(x, y2, '-r', label='cosinus')
plt.fill_between(x, y1, y2, color='gray', alpha=0.5)
plt.show()

Dans cet exemple, la zone entre les fonctions sinus et cosinus est remplie d'une couleur grise.

Introduction des remplissages conditionnels avec where

La fonction fill_between peut également accepter un argument where. Cet argument vous permet de spécifier une condition booléenne, sous laquelle le remplissage sera appliqué. En d'autres termes, le remplissage n'aura lieu que lorsque cette condition sera True.

Maintenant, utilisons un exemple simple de DataFrame pour illustrer cela. Supposons que nous ayons un DataFrame df avec les colonnes A et B, et que nous voulions remplir entre ces deux lignes:

plt.fill_between(df.index, df['A'], df['B'], where=(df['A'] > df['B']), color='gray', alpha=0.5)

Cela remplit la zone entre A et B uniquement lorsque A est supérieur à B.

Le problème: remplissage conditionnel entre des valeurs d'index spécifiques

Lorsque vous essayez d'utiliser fill_between avec une condition impliquant des valeurs d'index spécifiques, vous pouvez rencontrer une erreur courante. Cela est bien illustré par une question posée par un utilisateur qui souhaitait remplir la zone entre deux lignes, mais uniquement pour les mois spécifiques: 'janvier', 'février' et 'mars'. Leurs premières tentatives ont abouti à une ValueError ou à aucun remplissage du tout.

Plongeons dans ce problème, comprenons la cause fondamentale et proposons une solution infaillible, juste après la pause.

Comprendre la cause fondamentale de l'erreur

En poursuivant là où nous nous étions arrêtés, l'utilisateur a tenté de remplir entre deux lignes d'un DataFrame, avec une condition sur les valeurs d'index. Plus précisément, ils ont voulu appliquer le remplissage uniquement aux mois de 'janvier', 'février' et 'mars'. Cependant, ils ont rencontré un problème.

La ValueError qu'ils ont reçue lorsqu'ils ont essayé d'utiliser le mot-clé in avec un tableau et une liste est due au fait que le mot-clé in de Python vérifie si un élément est présent dans un itérable. Mais dans ce cas, il était utilisé pour vérifier si un tableau, qui n'est pas un itérable, est présent dans une liste. Cette opération est ambiguë et génère donc une erreur.

La raison pour laquelle leur deuxième tentative (où ils ont converti l'index en une liste et utilisé le mot-clé in) n'a pas abouti à un remplissage est que l'opération in n'était toujours pas vectorisée, c'est-à-dire appliquée élément par élément.

La solution: Vectoriser la condition avec isin()

Un concept clé dans pandas, la vectorisation consiste à effectuer des opérations sur des tableaux entiers plutôt que sur des éléments individuels. Pour remplir conditionnellement entre des lignes basé sur des valeurs d'index spécifiques, nous devons vectoriser la condition en utilisant la méthode intégrée de pandas .isin(). Cette méthode vérifie chaque élément de l'index du DataFrame par rapport à une liste et renvoie une série booléenne.

La solution correcte pour le problème de l'utilisateur serait donc:

ax.fill_between(x = plotMonths.index,
                y1 = plotMonths['ro laws'],
                y2 = plotMonths['ro ordos'],
                where = plotMonths.index.isin(['janvier', 'février', 'mars']),
                facecolor = 'lightskyblue',
                alpha = 0.2)

Ici, where = plotMonths.index.isin(['janvier', 'février', 'mars']) vérifie chaque élément de plotMonths.index par rapport à la liste ['janvier', 'février', 'mars'] et renvoie une série booléenne. Cette série est utilisée pour remplir conditionnellement entre les lignes 'ro laws' et 'ro ordos'.

Alternative à Matplotlib: Visualiser les données avec PyGWalker

Outre l'utilisation de Matplotlib pour visualiser votre dataframe pandas, voici une alternative, une bibliothèque Python Open Source qui peut vous aider à créer des visualisations de données facilement: PyGWalker (opens in a new tab). Veuillez fournir la traduction française de ce fichier de balisage. Évitez de traduire le code tel que: Traduisez le contenu de JSONldScript. S'il y a un en-tête, assurez-vous de traduire le paramètre de langue en "fr". Voici le fichier: PyGWalker pour la visualisation des données (opens in a new tab)

Plus besoin de réaliser des traitements compliqués avec du code Python, importez simplement vos données et faites glisser-déposer des variables pour créer toutes sortes de visualisations de données ! Voici une vidéo de démonstration rapide sur l'opération :


Voici comment utiliser PyGWalker dans votre cahier Jupyter :

pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)

Alternativement, vous pouvez l'essayer dans un cahier Kaggle/Google Colab :

Exécuter PyGWalker dans un cahier Kaggle (opens in a new tab)Exécuter PyGWalker dans Google Colab (opens in a new tab)Donnez une ⭐️ à PyGWalker sur GitHub (opens in a new tab)
Exécuter PyGWalker dans un cahier Kaggle (opens in a new tab)Exécuter PyGWalker dans Google Colab (opens in a new tab)Exécuter PyGWalker dans Google Colab (opens in a new tab)

PyGWalker est développé grâce au soutien de notre communauté Open Source. N'oubliez pas de consulter PyGWalker GitHub (opens in a new tab) et de nous donner une étoile !

Conclusion

La fonction fill_between de Matplotlib offre de puissantes fonctionnalités pour ajouter une emphase visuelle à vos tracés. Elle permet de remplir les zones entre les lignes et, avec l'utilisation de l'argument where, elle peut effectuer des remplissages conditionnels. Comprendre ces fonctionnalités et leurs principes sous-jacents est essentiel pour une visualisation efficace des données.

Questions fréquemment posées

Tout au long de cet article, nous avons exploré la fonction fill_between, ses utilisations et sa mise en œuvre. Voici quelques questions fréquemment posées pour récapituler et renforcer les points clés :

Q1 : Qu'est-ce que la fonction fill_between dans Matplotlib ?

La fonction fill_between est utilisée pour remplir la zone entre deux lignes dans un tracé. C'est un outil puissant pour mettre en évidence les différences, les tendances ou les motifs dans les données.

Q2 : Comment puis-je remplir des zones entre des lignes de manière conditionnelle dans Matplotlib ?

Vous pouvez utiliser l'argument where dans la fonction fill_between pour remplir des zones entre les lignes en fonction d'une condition. Cette condition doit être une série booléenne avec le même indice que vos valeurs x.

Q3 : Pourquoi ai-je une erreur de valeur lors de l'utilisation de fill_between avec une condition sur des valeurs d'indice spécifiques ?

Cette erreur se produit lorsque le mot-clé in de Python est utilisé pour vérifier si un tableau est dans une liste. Pour résoudre ce problème, vous pouvez utiliser la méthode .isin() de pandas, qui vérifie chaque élément de l'indice du DataFrame par rapport à une liste et renvoie une série booléenne.