Personnalisation des chemins de texte avec Matplotlib

Beginner

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

Introduction

Le module Matplotlib TextPath permet de créer un chemin qui délimite les caractères d'un texte. Le chemin obtenu peut être utilisé à plusieurs fins, comme par exemple comme chemin de découpage (clip path) pour une image. Dans ce laboratoire (lab), vous apprendrez à utiliser le module TextPath pour créer et personnaliser des chemins de texte pour les images.

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.

Parfois, 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 lors de votre apprentissage, n'hésitez pas à demander de l'aide à Labby. Donnez votre feedback après la session, et nous résoudrons rapidement le problème pour vous.

Installer Matplotlib

Avant de commencer, vous devez avoir Matplotlib installé dans votre environnement. Vous pouvez l'installer via pip en exécutant la commande suivante dans votre terminal :

pip install matplotlib

Importer les bibliothèques nécessaires

Tout d'abord, importez les bibliothèques nécessaires pour créer le TextPath.

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.cbook import get_sample_data
from matplotlib.image import BboxImage
from matplotlib.offsetbox import (AnchoredOffsetbox, AnnotationBbox, AuxTransformBox)
from matplotlib.patches import PathPatch, Shadow
from matplotlib.text import TextPath
from matplotlib.transforms import IdentityTransform

Créer un PathClippedImagePatch

Créez un objet PathClippedImagePatch pour dessiner une image d'un chemin de texte. Utilisez le code suivant pour créer un objet PathClippedImagePatch :

class PathClippedImagePatch(PathPatch):
    def __init__(self, path, bbox_image, **kwargs):
        super().__init__(path, **kwargs)
        self.bbox_image = BboxImage(
            self.get_window_extent, norm=None, origin=None)
        self.bbox_image.set_data(bbox_image)

    def set_facecolor(self, color):
        super().set_facecolor("none")

    def draw(self, renderer=None):
        self.bbox_image.set_clip_path(self._path, self.get_transform())
        self.bbox_image.draw(renderer)
        super().draw(renderer)

Créer une boîte de décalage (offset box)

Créez une boîte de décalage en utilisant AuxTransformBox pour ajouter l'objet PathClippedImagePatch. Utilisez le code suivant pour créer la boîte de décalage :

offsetbox = AuxTransformBox(IdentityTransform())
offsetbox.add_artist(p)

Créer une boîte de décalage ancrée (anchored offset box)

Créez une boîte de décalage ancrée en utilisant AnnotationBbox pour ajouter la boîte de décalage et définir sa position. Utilisez le code suivant pour créer la boîte de décalage ancrée :

ao = AnchoredOffsetbox(loc='upper left', child=offsetbox, frameon=True,
                           borderpad=0.2)
ax1.add_artist(ao)

Ajouter un autre texte

Ajoutez un autre texte à l'image en utilisant PathPatch. Utilisez le code suivant pour ajouter un autre texte :

for usetex, ypos, string in [
            (False, 0.25, r"textpath supports mathtext"),
            (True, 0.05, r"textpath supports \TeX"),
    ]:
        text_path = TextPath((0, 0), string, size=20, usetex=usetex)

        p1 = PathPatch(text_path, ec="w", lw=3, fc="w", alpha=0.9)
        p2 = PathPatch(text_path, ec="none", fc="k")

        offsetbox2 = AuxTransformBox(IdentityTransform())
        offsetbox2.add_artist(p1)
        offsetbox2.add_artist(p2)

        ab = AnnotationBbox(offsetbox2, (0.95, ypos),
                            xycoords='axes fraction',
                            boxcoords="offset points",
                            box_alignment=(1., 0.),
                            frameon=False,
                            )
        ax1.add_artist(ab)

Afficher l'image

Affichez l'image finale en utilisant le code suivant :

ax1.imshow([[0, 1, 2], [1, 2, 3]], cmap=plt.cm.gist_gray_r,
               interpolation="bilinear", aspect="auto")
plt.show()

Résumé

Dans ce laboratoire, vous avez appris à utiliser le module Matplotlib TextPath pour créer et personnaliser des chemins de texte (text paths) pour les images. En suivant les étapes décrites dans ce laboratoire, vous pouvez créer des images avec des chemins de texte personnalisés utiles à diverses fins.