Placement de boîtes de texte dans Matplotlib

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

Lors de la création de visualisations de données, l'ajout d'annotations peut grandement améliorer la compréhension des graphiques par le spectateur. Les boîtes de texte sont un moyen efficace d'inclure des informations supplémentaires directement dans vos visualisations. Matplotlib, une bibliothèque Python populaire pour la création de visualisations statiques, animées et interactives, propose des outils puissants pour ajouter des boîtes de texte personnalisables à vos graphiques.

Dans ce labo, vous apprendrez à placer des boîtes de texte dans des graphiques Matplotlib en utilisant Python. Vous découvrirez comment positionner le texte dans les coordonnées des axes, ce qui maintient le texte dans une position fixe par rapport au graphique, indépendamment des changements d'échelle des données. De plus, vous apprendrez à personnaliser les boîtes de texte avec différents styles, couleurs et niveaux de transparence en utilisant la propriété bbox.

À la fin de ce labo, vous serez en mesure de créer des graphiques informatifs et esthétiquement agréables avec des annotations stratégiquement placées pour vos projets de visualisation de données.

Conseils pour la machine virtuelle

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 finisse 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 pendant le labo, n'hésitez pas à demander de l'aide à Labby. Nous apprécions vos commentaires après la session pour nous aider à améliorer l'expérience du labo.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL matplotlib(("Matplotlib")) -.-> matplotlib/BasicConceptsGroup(["Basic Concepts"]) matplotlib(("Matplotlib")) -.-> matplotlib/PlottingDataGroup(["Plotting Data"]) matplotlib(("Matplotlib")) -.-> matplotlib/PlotCustomizationGroup(["Plot Customization"]) matplotlib/BasicConceptsGroup -.-> matplotlib/importing_matplotlib("Importing Matplotlib") matplotlib/BasicConceptsGroup -.-> matplotlib/figures_axes("Understanding Figures and Axes") matplotlib/PlottingDataGroup -.-> matplotlib/histograms("Histograms") matplotlib/PlotCustomizationGroup -.-> matplotlib/titles_labels("Adding Titles and Labels") matplotlib/PlotCustomizationGroup -.-> matplotlib/text_annotations("Text Annotations") subgraph Lab Skills matplotlib/importing_matplotlib -.-> lab-48868{{"Placement de boîtes de texte dans Matplotlib"}} matplotlib/figures_axes -.-> lab-48868{{"Placement de boîtes de texte dans Matplotlib"}} matplotlib/histograms -.-> lab-48868{{"Placement de boîtes de texte dans Matplotlib"}} matplotlib/titles_labels -.-> lab-48868{{"Placement de boîtes de texte dans Matplotlib"}} matplotlib/text_annotations -.-> lab-48868{{"Placement de boîtes de texte dans Matplotlib"}} end

Création d'un Jupyter Notebook et préparation des données

Dans cette première étape, nous allons créer un nouveau Jupyter Notebook et préparer nos données pour la visualisation.

Création d'un nouveau notebook

Dans la première cellule du notebook, importons les bibliothèques nécessaires. Tapez le code suivant et exécutez - le en cliquant sur le bouton "Run" ou en appuyant sur Shift + Enter :

import matplotlib.pyplot as plt
import numpy as np
libraries-imported

Ce code importe deux bibliothèques essentielles :

  • matplotlib.pyplot : Une collection de fonctions qui font fonctionner matplotlib comme MATLAB
  • numpy : Un package fondamental pour le calcul scientifique en Python

Création de données d'exemple

Maintenant, créons quelques données d'exemple que nous allons visualiser. Dans une nouvelle cellule, entrez et exécutez le code suivant :

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

## Generate 10,000 random numbers from a normal distribution
x = 30 * np.random.randn(10000)

## Calculate basic statistics
mu = x.mean()
median = np.median(x)
sigma = x.std()

## Display the statistics
print(f"Mean (μ): {mu:.2f}")
print(f"Median: {median:.2f}")
print(f"Standard Deviation (σ): {sigma:.2f}")

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

Mean (μ): -0.31
Median: -0.28
Standard Deviation (σ): 29.86

Les valeurs exactes peuvent varier légèrement. Nous avons créé un ensemble de données avec 10 000 nombres aléatoires générés à partir d'une distribution normale et calculé trois statistiques importantes :

  1. Moyenne (μ) : La valeur moyenne de tous les points de données
  2. Médiane : La valeur médiane lorsque les données sont triées par ordre croissant
  3. Écart - type (σ) : Une mesure de la dispersion des données

Ces statistiques seront utilisées plus tard pour annoter notre visualisation.

Création d'un histogramme de base

Maintenant que nous avons nos données, créons un histogramme pour visualiser sa distribution. Un histogramme divise les données en intervalles (plages) et montre la fréquence des points de données dans chaque intervalle.

Création de l'histogramme

Dans une nouvelle cellule de votre Jupyter Notebook, entrez et exécutez le code suivant :

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

## Create a histogram with 50 bins
histogram = ax.hist(x, bins=50, color='skyblue', edgecolor='black')

## Add title and labels
ax.set_title('Distribution of Random Data', fontsize=16)
ax.set_xlabel('Value', fontsize=12)
ax.set_ylabel('Frequency', fontsize=12)

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

Lorsque vous exécutez cette cellule, vous devriez voir un histogramme affichant la distribution de vos données aléatoires. La sortie ressemblera à une courbe en cloche (distribution normale) centrée autour de zéro.

Compréhension du code

Décortiquons ce que chaque ligne du code fait :

  1. fig, ax = plt.subplots(figsize=(10, 6)) : Crée un objet figure et un objet axes. Le paramètre figsize définit la taille du graphique en pouces (largeur, hauteur).

  2. histogram = ax.hist(x, bins=50, color='skyblue', edgecolor='black') : Crée un histogramme de nos données x avec 50 intervalles. Les intervalles sont colorés en bleu ciel avec des bordures noires.

  3. ax.set_title('Distribution of Random Data', fontsize=16) : Ajoute un titre au graphique avec une taille de police de 16.

  4. ax.set_xlabel('Value', fontsize=12) et ax.set_ylabel('Frequency', fontsize=12) : Ajoutent des étiquettes aux axes x et y avec une taille de police de 12.

  5. plt.tight_layout() : Ajuste automatiquement le graphique pour qu'il s'adapte à la zone de la figure.

  6. plt.show() : Affiche le graphique.

L'histogramme montre comment nos données sont distribuées. Étant donné que nous avons utilisé np.random.randn(), qui génère des données selon une distribution normale, l'histogramme a une forme en cloche centrée autour de 0. La hauteur de chaque barre représente le nombre de points de données qui tombent dans cette plage.

Ajout d'une boîte de texte avec des statistiques

Maintenant que nous avons un histogramme de base, améliorons - le en ajoutant une boîte de texte qui affiche les informations statistiques sur nos données. Cela rendra la visualisation plus informative pour les spectateurs.

Création du contenu textuel

Tout d'abord, nous devons préparer le contenu textuel qui ira à l'intérieur de notre boîte de texte. Dans une nouvelle cellule, entrez et exécutez le code suivant :

## Create a string with the statistics
textstr = '\n'.join((
    r'$\mu=%.2f$' % (mu,),           ## Mean
    r'$\mathrm{median}=%.2f$' % (median,),  ## Median
    r'$\sigma=%.2f$' % (sigma,)       ## Standard deviation
))

print("Text content for our box:")
print(textstr)

Vous devriez voir une sortie similaire à :

Text content for our box:
$\mu=-0.31$
$\mathrm{median}=-0.28$
$\sigma=29.86$

Ce code crée une chaîne de caractères multi - ligne contenant la moyenne, la médiane et l'écart - type de nos données. Examinons quelques aspects intéressants de ce code :

  1. La méthode \n'.join(...) joint plusieurs chaînes de caractères avec un caractère de nouvelle ligne entre elles.
  2. Le r avant chaque chaîne de caractères la transforme en une chaîne "brute", ce qui est utile lorsqu'on inclut des caractères spéciaux.
  3. La notation $...$ est utilisée pour la mise en forme mathématique au style LaTeX dans matplotlib.
  4. \mu et \sigma sont des symboles LaTeX pour les lettres grecques μ (mu) et σ (sigma).
  5. %.2f est un spécificateur de format qui affiche un nombre à virgule flottante avec deux décimales.

Création et ajout de la boîte de texte

Maintenant, recréons notre histogramme et ajoutons - lui la boîte de texte. Dans une nouvelle cellule, entrez et exécutez le code suivant :

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

## Create a histogram with 50 bins
histogram = ax.hist(x, bins=50, color='skyblue', edgecolor='black')

## Add title and labels
ax.set_title('Distribution of Random Data with Statistics', fontsize=16)
ax.set_xlabel('Value', fontsize=12)
ax.set_ylabel('Frequency', fontsize=12)

## Define the properties of the text box
properties = dict(boxstyle='round', facecolor='wheat', alpha=0.5)

## Add the text box to the plot
## Position the box in the top left corner (0.05, 0.95) in axes coordinates
ax.text(0.05, 0.95, textstr, transform=ax.transAxes, fontsize=14,
        verticalalignment='top', bbox=properties)

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

Lorsque vous exécutez cette cellule, vous devriez voir votre histogramme avec une boîte de texte dans le coin supérieur gauche affichant les statistiques.

Compréhension du code de la boîte de texte

Décortiquons les parties importantes du code qui créent la boîte de texte :

  1. properties = dict(boxstyle='round', facecolor='wheat', alpha=0.5) :

    • Cela crée un dictionnaire avec les propriétés de la boîte de texte.
    • boxstyle='round' : Donne à la boîte des coins arrondis.
    • facecolor='wheat' : Définit la couleur de fond de la boîte en couleur blé.
    • alpha=0.5 : Rend la boîte semi - transparente (opacité de 50 %).
  2. ax.text(0.05, 0.95, textstr, transform=ax.transAxes, fontsize=14, verticalalignment='top', bbox=properties) :

    • Cela ajoute du texte aux axes à la position (0,05, 0,95).
    • transform=ax.transAxes : C'est crucial - cela signifie que les coordonnées sont en unités d'axes (0 - 1) plutôt qu'en unités de données. Donc (0,05, 0,95) signifie "5 % depuis le bord gauche et 95 % depuis le bord inférieur du graphique".
    • fontsize=14 : Définit la taille de la police.
    • verticalalignment='top' : Aligne le texte de sorte que le haut du texte soit à la coordonnée y spécifiée.
    • bbox=properties : Applique les propriétés de notre boîte de texte.

La boîte de texte restera à la même position par rapport aux axes du graphique, même si vous zoomez sur le graphique ou changez la plage de données. C'est parce que nous avons utilisé transform=ax.transAxes, qui utilise des coordonnées d'axes au lieu de coordonnées de données.

Personnalisation de la boîte de texte

Maintenant que nous avons réussi à ajouter une boîte de texte à notre graphique, explorons diverses options de personnalisation pour la rendre plus attrayante visuellement et adaptée à différents contextes.

Expérimentation avec différents styles

Créons une fonction pour faciliter l'expérimentation avec différents styles de boîtes de texte. Dans une nouvelle cellule, entrez et exécutez le code suivant :

def plot_with_textbox(boxstyle, facecolor, alpha, position=(0.05, 0.95)):
    """
    Create a histogram with a custom text box.

    Parameters:
    boxstyle (str): Style of the box ('round', 'square', 'round4', etc.)
    facecolor (str): Background color of the box
    alpha (float): Transparency of the box (0-1)
    position (tuple): Position of the box in axes coordinates (x, y)
    """
    ## Create figure and plot
    fig, ax = plt.subplots(figsize=(8, 5))
    ax.hist(x, bins=50, color='skyblue', edgecolor='black')

    ## Set title and labels
    ax.set_title(f'Text Box Style: {boxstyle}', fontsize=16)
    ax.set_xlabel('Value', fontsize=12)
    ax.set_ylabel('Frequency', fontsize=12)

    ## Create text box properties
    box_props = dict(boxstyle=boxstyle, facecolor=facecolor, alpha=alpha)

    ## Add text box
    ax.text(position[0], position[1], textstr, transform=ax.transAxes,
            fontsize=14, verticalalignment='top', bbox=box_props)

    plt.tight_layout()
    plt.show()

Maintenant, utilisons cette fonction pour tester différents styles de boîtes. Dans une nouvelle cellule, entrez et exécutez :

## Try a square box with light green color
plot_with_textbox('square', 'lightgreen', 0.7)

## Try a rounded box with light blue color
plot_with_textbox('round', 'lightblue', 0.5)

## Try a box with extra rounded corners
plot_with_textbox('round4', 'lightyellow', 0.6)

## Try a sawtooth style box
plot_with_textbox('sawtooth', 'lightcoral', 0.4)

Lorsque vous exécutez cette cellule, vous verrez quatre graphiques différents, chacun avec un style de boîte de texte différent.

Changement de la position de la boîte de texte

La position d'une boîte de texte peut être cruciale pour la visualisation. Plaçons des boîtes de texte dans différents coins du graphique. Dans une nouvelle cellule, entrez et exécutez :

## Create a figure with a 2x2 grid of subplots
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
axes = axes.flatten()  ## Flatten to easily iterate

## Define positions for the four corners
positions = [
    (0.05, 0.95),  ## Top left
    (0.95, 0.95),  ## Top right
    (0.05, 0.05),  ## Bottom left
    (0.95, 0.05)   ## Bottom right
]

## Define alignments for each position
alignments = [
    ('top', 'left'),          ## Top left
    ('top', 'right'),         ## Top right
    ('bottom', 'left'),       ## Bottom left
    ('bottom', 'right')       ## Bottom right
]

## Corner labels
corner_labels = ['Top Left', 'Top Right', 'Bottom Left', 'Bottom Right']

## Create four plots with text boxes in different corners
for i, ax in enumerate(axes):
    ## Plot histogram
    ax.hist(x, bins=50, color='skyblue', edgecolor='black')

    ## Set title
    ax.set_title(f'Text Box in {corner_labels[i]}', fontsize=14)

    ## Create text box properties
    box_props = dict(boxstyle='round', facecolor='wheat', alpha=0.5)

    ## Add text box
    ax.text(positions[i][0], positions[i][1], textstr,
            transform=ax.transAxes, fontsize=12,
            verticalalignment=alignments[i][0],
            horizontalalignment=alignments[i][1],
            bbox=box_props)

plt.tight_layout()
plt.show()

Ce code crée une grille de 2x2 d'histogrammes, chacun avec une boîte de texte dans un coin différent.

Compréhension du positionnement de la boîte de texte

Plusieurs paramètres clés contrôlent le positionnement de la boîte de texte :

  1. Coordonnées de position : Les coordonnées (x, y) déterminent où la boîte de texte est placée. Lorsque vous utilisez transform=ax.transAxes, il s'agit de coordonnées d'axes où (0, 0) est le coin inférieur gauche et (1, 1) est le coin supérieur droit.

  2. Alignement vertical : Le paramètre verticalalignment contrôle l'alignement vertical du texte par rapport à la coordonnée y :

    • 'top' : Le haut du texte est à la coordonnée y spécifiée.
    • 'center' : Le centre du texte est à la coordonnée y spécifiée.
    • 'bottom' : Le bas du texte est à la coordonnée y spécifiée.
  3. Alignement horizontal : Le paramètre horizontalalignment contrôle l'alignement horizontal du texte par rapport à la coordonnée x :

    • 'left' : Le bord gauche du texte est à la coordonnée x spécifiée.
    • 'center' : Le centre du texte est à la coordonnée x spécifiée.
    • 'right' : Le bord droit du texte est à la coordonnée x spécifiée.

Ces options d'alignement sont particulièrement importantes lors du placement de texte dans les coins. Par exemple, dans le coin supérieur droit, vous voudrez utiliser horizontalalignment='right' pour que le bord droit du texte s'aligne avec le bord droit du graphique.

Création d'une visualisation finale avec plusieurs éléments textuels

Dans cette étape finale, nous allons combiner tout ce que nous avons appris pour créer une visualisation complète qui inclut plusieurs éléments textuels de styles différents. Cela démontrera comment les boîtes de texte peuvent être utilisées pour améliorer la narration des données.

Création d'une visualisation avancée

Créons un graphique plus sophistiqué qui inclut à la fois notre histogramme et quelques éléments visuels supplémentaires. Dans une nouvelle cellule, entrez et exécutez le code suivant :

## Create a figure with a larger size for our final visualization
fig, ax = plt.subplots(figsize=(12, 8))

## Plot the histogram with more bins and a different color
n, bins, patches = ax.hist(x, bins=75, color='lightblue',
                           edgecolor='darkblue', alpha=0.7)

## Add title and labels with improved styling
ax.set_title('Distribution of Random Data with Statistical Annotations',
             fontsize=18, fontweight='bold', pad=20)
ax.set_xlabel('Value', fontsize=14)
ax.set_ylabel('Frequency', fontsize=14)

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

## Mark the mean with a vertical line
ax.axvline(x=mu, color='red', linestyle='-', linewidth=2,
           label=f'Mean: {mu:.2f}')

## Mark one standard deviation range
ax.axvline(x=mu + sigma, color='green', linestyle='--', linewidth=1.5,
           label=f'Mean + 1σ: {mu+sigma:.2f}')
ax.axvline(x=mu - sigma, color='green', linestyle='--', linewidth=1.5,
           label=f'Mean - 1σ: {mu-sigma:.2f}')

## Create a text box with statistics in the top left
stats_box_props = dict(boxstyle='round', facecolor='lightyellow',
                      alpha=0.8, edgecolor='gold', linewidth=2)

stats_text = '\n'.join((
    r'$\mathbf{Statistics:}$',
    r'$\mu=%.2f$ (mean)' % (mu,),
    r'$\mathrm{median}=%.2f$' % (median,),
    r'$\sigma=%.2f$ (std. dev.)' % (sigma,)
))

ax.text(0.05, 0.95, stats_text, transform=ax.transAxes, fontsize=14,
        verticalalignment='top', bbox=stats_box_props)

## Add an informational text box in the top right
info_box_props = dict(boxstyle='round4', facecolor='lightcyan',
                     alpha=0.8, edgecolor='deepskyblue', linewidth=2)

info_text = '\n'.join((
    r'$\mathbf{About\ Normal\ Distributions:}$',
    r'$\bullet\ 68\%\ of\ data\ within\ 1\sigma$',
    r'$\bullet\ 95\%\ of\ data\ within\ 2\sigma$',
    r'$\bullet\ 99.7\%\ of\ data\ within\ 3\sigma$'
))

ax.text(0.95, 0.95, info_text, transform=ax.transAxes, fontsize=14,
        verticalalignment='top', horizontalalignment='right',
        bbox=info_box_props)

## Add a legend
ax.legend(fontsize=12)

## Tighten the layout and show the plot
plt.tight_layout()
plt.show()

Lorsque vous exécutez cette cellule, vous verrez une visualisation complète avec :

  • Un histogramme des données avec un style amélioré
  • Des lignes verticales marquant la moyenne et l'étendue d'un écart - type
  • Une boîte de texte de statistiques dans le coin supérieur gauche
  • Une boîte de texte informative sur les distributions normales dans le coin supérieur droit
  • Une légende expliquant les lignes verticales

Compréhension des éléments avancés

Examinons certains des nouveaux éléments que nous avons ajoutés :

  1. Lignes verticales avec axvline() :

    • Ces lignes marquent directement sur le graphique des statistiques importantes.
    • Le paramètre label permet d'inclure ces lignes dans la légende.
  2. Plusieurs boîtes de texte de styles différents :

    • Chaque boîte de texte a un objectif différent et utilise un style distinct.
    • La boîte de statistiques montre les valeurs calculées à partir de nos données.
    • La boîte informative fournit des informations contextuelles sur les distributions normales.
  3. Mise en forme améliorée :

    • La mise en forme LaTeX est utilisée pour créer du texte en gras avec \mathbf{}
    • Des points de liste sont créés avec \bullet
    • L'espacement est contrôlé avec \ (antislash suivi d'un espace)
  4. Grille et légende :

    • La grille aide les spectateurs à lire plus précisément les valeurs du graphique.
    • La légende explique la signification des lignes colorées.

Remarques finales sur le placement des boîtes de texte

Lorsque vous placez plusieurs éléments textuels dans une visualisation, considérez :

  1. Hiérarchie visuelle : L'information la plus importante devrait ressortir le plus.
  2. Positionnement : Placez les informations connexes près des parties pertinentes de la visualisation.
  3. Contraste : Assurez - vous que le texte est lisible par rapport à son arrière - plan.
  4. Cohérence : Utilisez un style cohérent pour les types d'informations similaires.
  5. Encombrement : Évitez de surcharger la visualisation avec trop d'éléments textuels.

En plaçant et en stylisant judicieusement les boîtes de texte, vous pouvez créer des visualisations à la fois informatives et esthétiquement agréables, guidant les spectateurs pour qu'ils comprennent les informations clés de vos données.

Résumé

Dans ce laboratoire, vous avez appris à utiliser efficacement les boîtes de texte dans Matplotlib pour améliorer vos visualisations de données. Récapitulons les points clés :

Concepts clés abordés

  1. Création de boîtes de texte de base : Vous avez appris à ajouter des boîtes de texte aux graphiques en utilisant la fonction matplotlib.pyplot.text() avec le paramètre bbox.

  2. Positionnement des boîtes de texte : Vous avez découvert comment positionner les boîtes de texte en utilisant les coordonnées des axes avec transform=ax.transAxes, ce qui maintient le texte dans une position fixe indépendamment de la mise à l'échelle des données.

  3. Stylisation des boîtes de texte : Vous avez exploré comment personnaliser les boîtes de texte avec différents styles (boxstyle), couleurs (facecolor), niveaux de transparence (alpha) et propriétés de bordure.

  4. Alignement du texte : Vous avez pratiqué l'utilisation de verticalalignment et horizontalalignment pour positionner correctement le texte dans différentes parties de votre visualisation.

  5. Mise en forme LaTeX : Vous avez utilisé la notation LaTeX pour ajouter des symboles mathématiques et une mise en forme à votre texte.

  6. Visualisation complète : Vous avez créé une visualisation complète qui combine plusieurs éléments textuels de styles différents pour raconter une histoire cohérente avec vos données.

Applications pratiques

Les techniques que vous avez apprises dans ce laboratoire peuvent être appliquées pour :

  • Ajouter des résumés statistiques aux graphiques
  • Étiqueter les caractéristiques clés de vos données
  • Fournir un contexte ou des explications dans les visualisations
  • Créer des légendes ou des clés avec une mise en forme personnalisée
  • Mettre en évidence les résultats ou les informations importantes

Étapes suivantes

Pour améliorer encore vos compétences en visualisation de données avec Matplotlib, envisagez d'explorer :

  • Des techniques d'annotation avancées telles que les flèches et les boîtes d'annotation
  • Des éléments textuels interactifs en utilisant la gestion d'événements de Matplotlib
  • La personnalisation du texte avec différentes polices et styles
  • La création de sous - graphiques avec des annotations coordonnées
  • La sauvegarde de vos visualisations avec des éléments textuels pour publication

En maîtrisant l'art des annotations textuelles dans Matplotlib, vous pouvez créer des visualisations de données plus informatives et professionnelles qui communiquent efficacement vos informations à votre public.