Styles de boîte personnalisés dans Matplotlib

Beginner

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

Introduction

Matplotlib est une bibliothèque de tracé pour le langage de programmation Python et son extension Numérique Mathématique NumPy. L'une des caractéristiques de Matplotlib est la capacité à créer des styles de boîte personnalisés.

Dans ce laboratoire, vous allez apprendre à implémenter des styles de boîte personnalisés dans Matplotlib. Vous allez apprendre à créer un style de boîte personnalisé sous forme de fonction et sous forme de classe. Vous allez également apprendre à enregistrer un style de boîte personnalisé avec Matplotlib.

Conseils sur la VM

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

Parfois, vous devrez peut-être attendre quelques secondes pour que Jupyter Notebook ait fini 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 l'apprentissage, n'hésitez pas à demander à Labby. Donnez des commentaires après la session, et nous résoudrons rapidement le problème pour vous.

Implémenter un style de boîte personnalisé sous forme de fonction

Les styles de boîte personnalisés peuvent être implémentés sous forme de fonctions qui prennent des arguments spécifiant à la fois une boîte rectangulaire et la quantité de "mutation", et renvoient le chemin "muté". Ici, nous allons implémenter un style de boîte personnalisé qui renvoie un nouveau chemin qui ajoute une forme "flèche" à gauche de la boîte.

import matplotlib.pyplot as plt
from matplotlib.patches import BoxStyle
from matplotlib.path import Path

def custom_box_style(x0, y0, width, height, mutation_size):
    """
    Étant donné l'emplacement et la taille de la boîte, renvoie le chemin de la boîte autour
    de celle-ci.

    La rotation est automatiquement prise en compte.

    Paramètres
    ----------
    x0, y0, width, height : float
        Emplacement et taille de la boîte.
    mutation_size : float
        Échelle de référence de mutation, généralement la taille de police du texte.
    """
    ## padding
    mypad = 0.3
    pad = mutation_size * mypad
    ## largeur et hauteur avec padding ajouté.
    width = width + 2 * pad
    height = height + 2 * pad
    ## limite de la boîte avec padding
    x0, y0 = x0 - pad, y0 - pad
    x1, y1 = x0 + width, y0 + height
    ## renvoie le nouveau chemin
    return Path([(x0, y0),
                 (x1, y0), (x1, y1), (x0, y1),
                 (x0-pad, (y0+y1)/2), (x0, y0),
                 (x0, y0)],
                closed=True)

fig, ax = plt.subplots(figsize=(3, 3))
ax.text(0.5, 0.5, "Test", size=30, va="center", ha="center", rotation=30,
        bbox=dict(boxstyle=custom_box_style, alpha=0.2))
plt.show()

Implémenter un style de boîte personnalisé sous forme de classe

Les styles de boîte personnalisés peuvent également être implémentés sous forme de classes qui implémentent __call__. Les classes peuvent ensuite être enregistrées dans le dictionnaire BoxStyle._style_list, ce qui permet de spécifier le style de boîte sous forme de chaîne de caractères, bbox=dict(boxstyle="nom_enregistré,param=valeur,...",...).

class MyStyle:
    """Une simple boîte."""

    def __init__(self, pad=0.3):
        """
        Les arguments doivent être des nombres flottants et avoir des valeurs par défaut.

        Paramètres
        ----------
        pad : float
            Quantité de padding
        """
        self.pad = pad
        super().__init__()

    def __call__(self, x0, y0, width, height, mutation_size):
        """
        Étant donné l'emplacement et la taille de la boîte, renvoie le chemin de la boîte
        autour de celle-ci.

        La rotation est automatiquement prise en compte.

        Paramètres
        ----------
        x0, y0, width, height : float
            Emplacement et taille de la boîte.
        mutation_size : float
            Échelle de référence pour la mutation, généralement la taille de police du texte.
        """
        ## padding
        pad = mutation_size * self.pad
        ## largeur et hauteur avec padding ajouté
        width = width + 2.*pad
        height = height + 2.*pad
        ## limite de la boîte avec padding
        x0, y0 = x0 - pad, y0 - pad
        x1, y1 = x0 + width, y0 + height
        ## renvoie le nouveau chemin
        return Path([(x0, y0),
                     (x1, y0), (x1, y1), (x0, y1),
                     (x0-pad, (y0+y1)/2.), (x0, y0),
                     (x0, y0)],
                    closed=True)


BoxStyle._style_list["angled"] = MyStyle  ## Enregistre le style personnalisé.

fig, ax = plt.subplots(figsize=(3, 3))
ax.text(0.5, 0.5, "Test", size=30, va="center", ha="center", rotation=30,
        bbox=dict(boxstyle="angled,pad=0.5", alpha=0.2))

del BoxStyle._style_list["angled"]  ## Désenregistre-le.

plt.show()

Enregistrer le style de boîte personnalisé avec Matplotlib

Une fois que vous avez implémenté un style de boîte personnalisé sous forme de classe, vous pouvez l'enregistrer avec Matplotlib. Cela vous permet de spécifier le style de boîte sous forme de chaîne de caractères, bbox=dict(boxstyle="nom_enregistré,param=valeur,...",...).

BoxStyle._style_list["angled"] = MyStyle  ## Enregistre le style personnalisé.

Utiliser le style de boîte personnalisé

Une fois que vous avez implémenté et enregistré un style de boîte personnalisé, vous pouvez l'utiliser avec Axes.text.

fig, ax = plt.subplots(figsize=(3, 3))
ax.text(0.5, 0.5, "Test", size=30, va="center", ha="center", rotation=30,
        bbox=dict(boxstyle="angled,pad=0.5", alpha=0.2))

Récapitulatif

Dans ce laboratoire, vous avez appris à implémenter des styles de boîte personnalisés dans Matplotlib. Vous avez appris à créer un style de boîte personnalisé sous forme de fonction et sous forme de classe. Vous avez également appris à enregistrer un style de boîte personnalisé avec Matplotlib et à l'utiliser avec Axes.text.