はじめに
Matplotlib は、Python プログラミング言語とその数値数学拡張 NumPy 用のグラフ描画ライブラリです。Matplotlib の特徴の 1 つは、カスタマイズ可能なボックススタイルを作成できることです。
この実験では、Matplotlib でカスタムボックススタイルを実装する方法を学びます。関数として、またクラスとしてカスタムボックススタイルを作成する方法を学びます。また、Matplotlib にカスタムボックススタイルを登録する方法も学びます。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題がある場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
関数としてカスタムボックススタイルを実装する
カスタムボックススタイルは、長方形のボックスと「変異」量を指定する引数を受け取り、「変異」されたパスを返す関数として実装できます。ここでは、ボックスの左側に「矢印」形状を追加した新しいパスを返すカスタムボックススタイルを実装します。
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):
"""
ボックスの位置とサイズを指定すると、その周りのボックスのパスを返します。
回転は自動的に処理されます。
パラメータ
----------
x0, y0, width, height : float
ボックスの位置とサイズ。
mutation_size : float
変異基準スケール、通常はテキストのフォントサイズ。
"""
## パディング
mypad = 0.3
pad = mutation_size * mypad
## パディングを加えた幅と高さ。
width = width + 2 * pad
height = height + 2 * pad
## パディング付きボックスの境界
x0, y0 = x0 - pad, y0 - pad
x1, y1 = x0 + width, y0 + height
## 新しいパスを返す
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()
クラスとしてカスタムボックススタイルを実装する
カスタムボックススタイルは、__call__ を実装するクラスとしても実装できます。その後、これらのクラスを BoxStyle._style_list 辞書に登録することができ、これにより、ボックススタイルを文字列として指定できます。bbox=dict(boxstyle="登録名,param=値,...",...) です。
class MyStyle:
"""シンプルなボックス。"""
def __init__(self, pad=0.3):
"""
引数は浮動小数点数で、デフォルト値を持っている必要があります。
パラメータ
----------
pad : float
パディング量
"""
self.pad = pad
super().__init__()
def __call__(self, x0, y0, width, height, mutation_size):
"""
ボックスの位置とサイズを指定すると、その周りのボックスのパスを返します。
回転は自動的に処理されます。
パラメータ
----------
x0, y0, width, height : float
ボックスの位置とサイズ。
mutation_size : float
変異の基準スケール、通常はテキストのフォントサイズ。
"""
## パディング
pad = mutation_size * self.pad
## パディングを加えた幅と高さ
width = width + 2.*pad
height = height + 2.*pad
## パディング付きボックスの境界
x0, y0 = x0 - pad, y0 - pad
x1, y1 = x0 + width, y0 + height
## 新しいパスを返す
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 ## カスタムスタイルを登録します。
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"] ## 登録解除します。
plt.show()
Matplotlib にカスタムボックススタイルを登録する
クラスとしてカスタムボックススタイルを実装したら、Matplotlib に登録できます。これにより、ボックススタイルを文字列として指定できます。bbox=dict(boxstyle="登録名,param=値,...",...) です。
BoxStyle._style_list["angled"] = MyStyle ## カスタムスタイルを登録します。
カスタムボックススタイルを使用する
カスタムボックススタイルを実装して登録したら、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))
まとめ
この実験では、Matplotlib でカスタムボックススタイルを実装する方法を学びました。関数として、またはクラスとしてカスタムボックススタイルを作成する方法を学びました。また、Matplotlib にカスタムボックススタイルを登録する方法と、Axes.text でそれを使用する方法も学びました。