Matplotlib におけるカスタムボックススタイル

PythonPythonBeginner
今すぐ練習

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

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

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 でそれを使用する方法も学びました。