はじめに
Matplotlib の TextPath モジュールは、テキストの文字を輪郭付けたパスを作成することができます。生成されたパスは、画像のクリップパスなど、いくつかの目的に使用できます。この実験では、TextPath モジュールを使用して画像用のテキストパスを作成し、カスタマイズする方法を学びます。
VM のヒント
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)
オフセットボックスを作成する
AuxTransformBox を使用してオフセットボックスを作成し、PathClippedImagePatch オブジェクトを追加します。以下のコードを使用してオフセットボックスを作成します。
offsetbox = AuxTransformBox(IdentityTransform())
offsetbox.add_artist(p)
固定オフセットボックスを作成する
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 モジュールを使用して画像用のテキストパスを作成し、カスタマイズする方法を学びました。この実験で概説された手順に従うことで、さまざまな目的に役立つカスタムテキストパスを持つ画像を作成することができます。