Création de graphiques à axe brisé en Python

MatplotlibMatplotlibBeginner
Pratiquer maintenant

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

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

La visualisation de données présente souvent des défis lorsqu'il s'agit de gérer les valeurs aberrantes (outliers). Ces valeurs extrêmes peuvent compresser la majorité de vos points de données, rendant difficile l'observation de modèles ou de détails importants. Un graphique à axe brisé offre une solution élégante en « brisant » l'axe pour afficher différentes plages de valeurs, vous permettant de vous concentrer à la fois sur la distribution principale des données et sur les valeurs aberrantes simultanément.

Dans ce tutoriel, nous allons apprendre à créer un graphique à axe brisé en utilisant Matplotlib en Python. Cette technique est particulièrement utile lors de la visualisation de jeux de données présentant des disparités importantes de valeurs, permettant une représentation plus claire à la fois des données normales et des valeurs extrêmes.

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. En raison des limitations de Jupyter Notebook, la validation des opérations ne peut pas être automatisée.

Si vous rencontrez des problèmes lors de ce laboratoire, n'hésitez pas à demander de l'aide à Labby. Veuillez fournir des commentaires après la session afin que nous puissions résoudre rapidement les problèmes que vous avez rencontrés.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL matplotlib(("Matplotlib")) -.-> matplotlib/BasicConceptsGroup(["Basic Concepts"]) matplotlib(("Matplotlib")) -.-> matplotlib/AdvancedPlottingGroup(["Advanced Plotting"]) matplotlib(("Matplotlib")) -.-> matplotlib/PlotCustomizationGroup(["Plot Customization"]) matplotlib/BasicConceptsGroup -.-> matplotlib/importing_matplotlib("Importing Matplotlib") matplotlib/BasicConceptsGroup -.-> matplotlib/figures_axes("Understanding Figures and Axes") matplotlib/AdvancedPlottingGroup -.-> matplotlib/subplots("Subplots") matplotlib/PlotCustomizationGroup -.-> matplotlib/titles_labels("Adding Titles and Labels") matplotlib/PlotCustomizationGroup -.-> matplotlib/axis_ticks("Axis Ticks Customization") matplotlib/PlotCustomizationGroup -.-> matplotlib/grid_config("Grid Configuration") subgraph Lab Skills matplotlib/importing_matplotlib -.-> lab-48592{{"Création de graphiques à axe brisé en Python"}} matplotlib/figures_axes -.-> lab-48592{{"Création de graphiques à axe brisé en Python"}} matplotlib/subplots -.-> lab-48592{{"Création de graphiques à axe brisé en Python"}} matplotlib/titles_labels -.-> lab-48592{{"Création de graphiques à axe brisé en Python"}} matplotlib/axis_ticks -.-> lab-48592{{"Création de graphiques à axe brisé en Python"}} matplotlib/grid_config -.-> lab-48592{{"Création de graphiques à axe brisé en Python"}} end

Préparation de l'environnement et création de données

Dans cette première étape, nous allons configurer notre environnement de travail en important les bibliothèques nécessaires et en créant des données d'exemple pour notre visualisation. Nous allons nous concentrer sur la génération de données qui incluent quelques valeurs aberrantes (outliers), ce qui démontrera l'intérêt d'utiliser un graphique à axe brisé.

Importation des bibliothèques requises

Commençons par importer les bibliothèques dont nous avons besoin pour ce tutoriel. Nous utiliserons Matplotlib pour créer nos visualisations et NumPy pour générer et manipuler des données numériques.

Créez une nouvelle cellule dans votre Jupyter Notebook et tapez le code suivant :

import matplotlib.pyplot as plt
import numpy as np

print(f"NumPy version: {np.__version__}")

Lorsque vous exécutez cette cellule, vous devriez voir une sortie similaire à ceci :

NumPy version: 2.0.0
numpy-version

Les numéros de version exacts peuvent varier en fonction de votre environnement, mais cela confirme que les bibliothèques sont correctement installées et prêtes à être utilisées.

Génération de données d'exemple avec des valeurs aberrantes

Maintenant, créons un jeu de données d'exemple qui inclut quelques valeurs aberrantes. Nous allons générer des nombres aléatoires, puis ajouter délibérément des valeurs plus grandes à certaines positions pour créer nos valeurs aberrantes.

Créez une nouvelle cellule et ajoutez le code suivant :

## Set random seed for reproducibility
np.random.seed(19680801)

## Generate 30 random points with values between 0 and 0.2
pts = np.random.rand(30) * 0.2

## Add 0.8 to two specific points to create outliers
pts[[3, 14]] += 0.8

## Display the first few data points to understand our dataset
print("First 10 data points:")
print(pts[:10])
print("\nData points containing outliers:")
print(pts[[3, 14]])

Lorsque vous exécutez cette cellule, vous devriez voir une sortie similaire à :

First 10 data points:
[0.01182225 0.11765474 0.07404329 0.91088185 0.10502995 0.11190702
 0.14047499 0.01060192 0.15226977 0.06145634]

Data points containing outliers:
[0.91088185 0.97360754]

Dans cette sortie, vous pouvez clairement voir que les valeurs aux indices 3 et 14 sont beaucoup plus grandes que les autres valeurs. Ce sont nos valeurs aberrantes. La plupart de nos points de données sont inférieurs à 0,2, mais ces deux valeurs aberrantes sont supérieures à 0,9, créant une disparité significative dans notre jeu de données.

Ce type de distribution de données est parfait pour démontrer l'utilité d'un graphique à axe brisé. Dans l'étape suivante, nous allons créer la structure du graphique et la configurer pour afficher correctement à la fois les données principales et les valeurs aberrantes.

Création et configuration du graphique à axe brisé

Dans cette étape, nous allons créer la structure réelle du graphique à axe brisé. Un graphique à axe brisé se compose de plusieurs sous-graphiques qui affichent différentes plages de la même donnée. Nous allons configurer ces sous-graphiques pour afficher efficacement nos données principales et nos valeurs aberrantes (outliers).

Création des sous-graphiques

Tout d'abord, nous devons créer deux sous-graphiques disposés verticalement. Le sous-graphique supérieur affichera nos valeurs aberrantes, tandis que le sous-graphique inférieur montrera la majorité de nos points de données.

Créez une nouvelle cellule dans votre notebook et ajoutez le code suivant :

## Create two subplots stacked vertically with shared x-axis
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(8, 6))

## Add a main title to the figure
fig.suptitle('Broken Axis Plot Example', fontsize=16)

## Plot the same data on both axes
ax1.plot(pts, 'o-', color='blue')
ax2.plot(pts, 'o-', color='blue')

## Display the figure to see both subplots
plt.tight_layout()
plt.show()
broken-axis-plot

Lorsque vous exécutez cette cellule, vous devriez voir une figure avec deux sous-graphiques, tous deux affichant les mêmes données. Remarquez comment les valeurs aberrantes compressent le reste des données dans les deux graphiques, rendant difficile la visualisation des détails de la majorité des points de données. C'est exactement le problème que nous essayons de résoudre avec un graphique à axe brisé.

Configuration des limites de l'axe des ordonnées (Y)

Maintenant, nous devons configurer chaque sous-graphique pour nous concentrer sur une plage spécifique de valeurs de l'axe des ordonnées. Le sous-graphique supérieur se concentrera sur la plage des valeurs aberrantes, tandis que le sous-graphique inférieur se concentrera sur la plage des données principales.

Créez une nouvelle cellule et ajoutez le code suivant :

## Create two subplots stacked vertically with shared x-axis
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(8, 6))

## Plot the same data on both axes
ax1.plot(pts, 'o-', color='blue')
ax2.plot(pts, 'o-', color='blue')

## Set y-axis limits for each subplot
ax1.set_ylim(0.78, 1.0)    ## Top subplot shows only the outliers
ax2.set_ylim(0, 0.22)      ## Bottom subplot shows only the main data

## Add a title to each subplot
ax1.set_title('Outlier Region')
ax2.set_title('Main Data Region')

## Display the figure with adjusted y-axis limits
plt.tight_layout()
plt.show()

Lorsque vous exécutez cette cellule, vous devriez voir que chaque sous-graphique se concentre maintenant sur une plage différente de valeurs de l'axe des ordonnées. Le graphique supérieur montre seulement les valeurs aberrantes, et le graphique inférieur montre seulement les données principales. Cela améliore déjà la visualisation, mais pour en faire un véritable graphique à axe brisé, nous devons ajouter quelques configurations supplémentaires.

Masquage des bords (spines) et ajustement des graduations (ticks)

Pour créer l'illusion d'un axe « brisé », nous devons masquer les bords de connexion entre les deux sous-graphiques et ajuster la position des graduations.

Créez une nouvelle cellule et ajoutez le code suivant :

## Create two subplots stacked vertically with shared x-axis
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(8, 6))

## Plot the same data on both axes
ax1.plot(pts, 'o-', color='blue')
ax2.plot(pts, 'o-', color='blue')

## Set y-axis limits for each subplot
ax1.set_ylim(0.78, 1.0)    ## Top subplot shows only the outliers
ax2.set_ylim(0, 0.22)      ## Bottom subplot shows only the main data

## Hide the spines between ax1 and ax2
ax1.spines.bottom.set_visible(False)
ax2.spines.top.set_visible(False)

## Adjust the position of the ticks
ax1.xaxis.tick_top()          ## Move x-axis ticks to the top
ax1.tick_params(labeltop=False)  ## Hide x-axis tick labels at the top
ax2.xaxis.tick_bottom()       ## Keep x-axis ticks at the bottom

## Add labels to the plot
ax2.set_xlabel('Data Point Index')
ax2.set_ylabel('Value')
ax1.set_ylabel('Value')

plt.tight_layout()
plt.show()

Lorsque vous exécutez cette cellule, vous devriez voir que le graphique a maintenant des bords masqués entre les deux sous-graphiques, donnant un aspect plus propre. Les graduations de l'axe des abscisses sont maintenant correctement positionnées, avec des étiquettes seulement en bas.

À ce stade, nous avons réussi à créer un graphique à axe brisé de base. Dans l'étape suivante, nous ajouterons des touches finales pour que les spectateurs comprennent clairement que l'axe est brisé.

Ajout de touches finales au graphique à axe brisé

Dans cette étape finale, nous allons ajouter des touches finales à notre graphique à axe brisé pour indiquer clairement que l'axe des ordonnées (y-axis) est brisé. Nous allons ajouter des lignes diagonales entre les sous-graphiques pour indiquer la rupture, et nous allons améliorer l'apparence globale du graphique avec des étiquettes appropriées et une grille.

Ajout de lignes diagonales de rupture

Pour indiquer visuellement que l'axe est brisé, nous allons ajouter des lignes diagonales entre les deux sous-graphiques. C'est une convention courante qui aide les spectateurs à comprendre qu'une partie de l'axe a été omise.

Créez une nouvelle cellule et ajoutez le code suivant :

## Create two subplots stacked vertically with shared x-axis
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(8, 6))

## Plot the same data on both axes
ax1.plot(pts, 'o-', color='blue')
ax2.plot(pts, 'o-', color='blue')

## Set y-axis limits for each subplot
ax1.set_ylim(0.78, 1.0)    ## Top subplot shows only the outliers
ax2.set_ylim(0, 0.22)      ## Bottom subplot shows only the main data

## Hide the spines between ax1 and ax2
ax1.spines.bottom.set_visible(False)
ax2.spines.top.set_visible(False)

## Adjust the position of the ticks
ax1.xaxis.tick_top()          ## Move x-axis ticks to the top
ax1.tick_params(labeltop=False)  ## Hide x-axis tick labels at the top
ax2.xaxis.tick_bottom()       ## Keep x-axis ticks at the bottom

## Add diagonal break lines
d = 0.5  ## proportion of vertical to horizontal extent of the slanted line
kwargs = dict(marker=[(-1, -d), (1, d)], markersize=12,
              linestyle='none', color='k', mec='k', mew=1, clip_on=False)
ax1.plot([0, 1], [0, 0], transform=ax1.transAxes, **kwargs)
ax2.plot([0, 1], [1, 1], transform=ax2.transAxes, **kwargs)

## Add labels and a title
ax2.set_xlabel('Data Point Index')
ax2.set_ylabel('Value')
ax1.set_ylabel('Value')
fig.suptitle('Dataset with Outliers', fontsize=16)

## Add a grid to both subplots for better readability
ax1.grid(True, linestyle='--', alpha=0.7)
ax2.grid(True, linestyle='--', alpha=0.7)

plt.tight_layout()
plt.subplots_adjust(hspace=0.1)  ## Adjust the space between subplots
plt.show()

Lorsque vous exécutez cette cellule, vous devriez voir le graphique à axe brisé complet avec des lignes diagonales indiquant la rupture de l'axe des ordonnées. Le graphique a maintenant un titre, des étiquettes d'axes et des lignes de grille pour améliorer la lisibilité.

Compréhension du graphique à axe brisé

Prenons un moment pour comprendre les éléments clés de notre graphique à axe brisé :

  1. Deux sous-graphiques : Nous avons créé deux sous-graphiques distincts, chacun se concentrant sur une plage différente de valeurs de l'axe des ordonnées.
  2. Bords masqués : Nous avons masqué les bords de connexion entre les sous-graphiques pour créer une séparation visuelle.
  3. Lignes diagonales de rupture : Nous avons ajouté des lignes diagonales pour indiquer que l'axe est brisé.
  4. Limites de l'axe des ordonnées : Nous avons défini des limites différentes pour l'axe des ordonnées de chaque sous-graphique pour nous concentrer sur des parties spécifiques des données.
  5. Lignes de grille : Nous avons ajouté des lignes de grille pour améliorer la lisibilité et faciliter l'estimation des valeurs.

Cette technique est particulièrement utile lorsque vous avez des valeurs aberrantes (outliers) dans vos données qui compresseraient autrement la visualisation de la majorité de vos points de données. En « brisant » l'axe, vous pouvez montrer clairement à la fois les valeurs aberrantes et la distribution principale des données dans une seule figure.

Expérimentation avec le graphique

Maintenant que vous savez comment créer un graphique à axe brisé, vous pouvez expérimenter avec différentes configurations. Essayez de changer les limites de l'axe des ordonnées, d'ajouter plus de fonctionnalités au graphique ou d'appliquer cette technique à vos propres données.

Par exemple, vous pouvez modifier le code précédent pour inclure une légende, changer le schéma de couleurs ou ajuster les styles de marqueurs :

## Create two subplots stacked vertically with shared x-axis
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(8, 6))

## Plot the same data on both axes with different styles
ax1.plot(pts, 'o-', color='darkblue', label='Data Points', linewidth=2)
ax2.plot(pts, 'o-', color='darkblue', linewidth=2)

## Mark the outliers with a different color
outlier_indices = [3, 14]
ax1.plot(outlier_indices, pts[outlier_indices], 'ro', markersize=8, label='Outliers')

## Set y-axis limits for each subplot
ax1.set_ylim(0.78, 1.0)    ## Top subplot shows only the outliers
ax2.set_ylim(0, 0.22)      ## Bottom subplot shows only the main data

## Hide the spines between ax1 and ax2
ax1.spines.bottom.set_visible(False)
ax2.spines.top.set_visible(False)

## Adjust the position of the ticks
ax1.xaxis.tick_top()          ## Move x-axis ticks to the top
ax1.tick_params(labeltop=False)  ## Hide x-axis tick labels at the top
ax2.xaxis.tick_bottom()       ## Keep x-axis ticks at the bottom

## Add diagonal break lines
d = 0.5  ## proportion of vertical to horizontal extent of the slanted line
kwargs = dict(marker=[(-1, -d), (1, d)], markersize=12,
              linestyle='none', color='k', mec='k', mew=1, clip_on=False)
ax1.plot([0, 1], [0, 0], transform=ax1.transAxes, **kwargs)
ax2.plot([0, 1], [1, 1], transform=ax2.transAxes, **kwargs)

## Add labels and a title
ax2.set_xlabel('Data Point Index')
ax2.set_ylabel('Value')
ax1.set_ylabel('Value')
fig.suptitle('Dataset with Outliers - Enhanced Visualization', fontsize=16)

## Add a grid to both subplots for better readability
ax1.grid(True, linestyle='--', alpha=0.7)
ax2.grid(True, linestyle='--', alpha=0.7)

## Add a legend to the top subplot
ax1.legend(loc='upper right')

plt.tight_layout()
plt.subplots_adjust(hspace=0.1)  ## Adjust the space between subplots
plt.show()

Lorsque vous exécutez ce code amélioré, vous devriez voir une visualisation améliorée avec les valeurs aberrantes spécifiquement marquées et une légende expliquant les points de données.

Félicitations ! Vous avez réussi à créer un graphique à axe brisé en Python en utilisant Matplotlib. Cette technique vous aidera à créer des visualisations plus efficaces lorsque vous aurez à traiter des données contenant des valeurs aberrantes.

Résumé

Dans ce tutoriel, vous avez appris à créer un graphique à axe brisé en utilisant Matplotlib en Python. Cette technique de visualisation est précieuse lorsqu'il s'agit de traiter des données contenant des valeurs aberrantes (outliers), car elle vous permet d'afficher clairement à la fois la distribution principale des données et les valeurs aberrantes dans une seule figure.

Voici un récapitulatif de ce que vous avez accompli :

  1. Configuration de l'environnement et création des données : Vous avez importé les bibliothèques nécessaires et créé des données d'exemple contenant des valeurs aberrantes pour démontrer le concept.

  2. Création de la structure de base du graphique : Vous avez créé deux sous-graphiques avec des limites différentes pour l'axe des ordonnées afin de vous concentrer sur différentes plages de valeurs et configuré l'apparence des axes.

  3. Amélioration de la visualisation : Vous avez ajouté des lignes diagonales de rupture pour indiquer l'axe brisé, amélioré l'apparence du graphique avec des étiquettes et une grille, et appris à personnaliser davantage la visualisation.

La technique de l'axe brisé résout un problème courant de visualisation de données en permettant aux spectateurs de voir à la fois la structure globale et les détails d'un ensemble de données simultanément, même lorsque les valeurs aberrantes compresseraient normalement la visualisation de la majorité des points de données.

Vous pouvez appliquer cette technique à vos propres tâches d'analyse et de visualisation de données chaque fois que vous avez besoin de représenter des données avec des plages de valeurs significativement différentes de manière claire et efficace.