Personalización de rutas de texto con Matplotlib

PythonPythonBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

El módulo TextPath de Matplotlib permite crear una ruta que delimita los caracteres de un texto. La ruta resultante se puede utilizar para varios fines, como una ruta de recorte para una imagen. En este laboratorio, aprenderás cómo utilizar el módulo TextPath para crear y personalizar rutas de texto para imágenes.

Consejos para la MV

Después de que la máquina virtual (VM) haya terminado de iniciar, haz clic en la esquina superior izquierda para cambiar a la pestaña Notebook y acceder a Jupyter Notebook para practicar.

A veces, es posible que debas esperar unos segundos para que Jupyter Notebook termine de cargar. Debido a las limitaciones de Jupyter Notebook, la validación de las operaciones no se puede automatizar.

Si encuentras problemas durante el aprendizaje, no dudes en preguntar a Labby. Proporciona comentarios después de la sesión y resolveremos rápidamente el problema para ti.

Instalar Matplotlib

Antes de comenzar, debes tener Matplotlib instalado en tu entorno. Puedes instalarlo a través de pip ejecutando el siguiente comando en tu terminal:

pip install matplotlib

Importar las bibliotecas necesarias

Primero, importa las bibliotecas necesarias para crear la 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

Crear un PathClippedImagePatch

Crea un objeto PathClippedImagePatch para dibujar una imagen de una ruta de texto. Utiliza el siguiente código para crear un objeto 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)

Crear una caja de desplazamiento (offset box)

Crea una caja de desplazamiento utilizando AuxTransformBox para agregar el objeto PathClippedImagePatch. Utiliza el siguiente código para crear la caja de desplazamiento:

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

Crear una caja de desplazamiento anclada (anchored offset box)

Crea una caja de desplazamiento anclada utilizando AnnotationBbox para agregar la caja de desplazamiento y establecer su posición. Utiliza el siguiente código para crear la caja de desplazamiento anclada:

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

Agregar otro texto

Agrega otro texto a la imagen utilizando PathPatch. Utiliza el siguiente código para agregar otro texto:

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)

Mostrar la imagen

Muestra la imagen final utilizando el siguiente código:

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

Resumen

En este laboratorio, aprendiste cómo utilizar el módulo Matplotlib TextPath para crear y personalizar rutas de texto (text paths) para imágenes. Siguiendo los pasos descritos en este laboratorio, puedes crear imágenes con rutas de texto personalizadas que son útiles para una variedad de propósitos.