Настройка текстовых путей с использованием Matplotlib

Beginner

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

Введение

Модуль Matplotlib TextPath позволяет создавать путь, который обводит символы текста. Полученный путь может быть использован для различных целей, например, в качестве пути обрезки (clip path) для изображения. В этом практическом занятии (lab) вы научитесь использовать модуль TextPath для создания и настройки текстовых путей для изображений.

Советы по виртуальной машине (VM)

После запуска виртуальной машины нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если у вас возникнут проблемы во время обучения, не стесняйтесь обращаться к Labby. После занятия оставьте отзыв, и мы оперативно решим проблему для вас.

Установка Matplotlib

Перед началом работы убедитесь, что в вашей среде установлен Matplotlib. Вы можете установить его с помощью pip, выполнив следующую команду в терминале:

pip install matplotlib

Импорт необходимых библиотек

Сначала импортируйте необходимые библиотеки для создания 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

Создание объекта PathClippedImagePatch

Создайте объект PathClippedImagePatch для отображения изображения текстового пути. Используйте следующий код для создания объекта 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)

Создание смещенного контейнера (offset box)

Создайте смещенный контейнер с использованием AuxTransformBox для добавления объекта PathClippedImagePatch. Используйте следующий код для создания смещенного контейнера:

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

Создание закрепленного смещенного контейнера (anchored offset box)

Создайте закрепленный смещенный контейнер с использованием AnnotationBbox для добавления смещенного контейнера и установки его позиции. Используйте следующий код для создания закрепленного смещенного контейнера:

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

Добавление дополнительного текста

Добавьте дополнительный текст на изображение с использованием PathPatch. Используйте следующий код для добавления дополнительного текста:

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)

Отображение изображения

Покажите конечное изображение с использованием следующего кода:

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

Резюме

В этом практическом занятии (лабораторной работе) вы узнали, как использовать модуль Matplotlib TextPath для создания и настройки текстовых путей (text paths) для изображений. Следуя шагам, описанным в этом практическом занятии, вы можете создавать изображения с настраиваемыми текстовыми путями, которые полезны для различных целей.