Matplotlib の矢印に角度注釈を追加する

Beginner

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

はじめに

この実験では、Matplotlib の FancyArrowPatch を使って作成したブラケット矢印スタイルに角度注釈を追加する方法を学びます。角度注釈は、グラフ内の角度の方向と大きさを示すのに役立ちます。この実験が終了すると、角度注釈付きのブラケット矢印スタイルを作成し、特定のニーズに合わせてカスタマイズできるようになります。

VM のヒント

VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替え、Jupyter Notebook を使って練習します。

時々、Jupyter Notebook が読み込み終了するまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。

学習中に問題に直面した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

必要なライブラリをインポートしてグラフを設定する

まず、必要なライブラリをインポートしてグラフを設定する必要があります。matplotlib.pyplotnumpy を使用します。また、データをプロットするための figure と axis オブジェクトを作成します。

import matplotlib.pyplot as plt
import numpy as np

from matplotlib.patches import FancyArrowPatch

fig, ax = plt.subplots()
ax.set(xlim=(0, 6), ylim=(-1, 5))
ax.set_title("Orientation of the bracket arrows relative to angleA and angleB")

回転させた垂直線の端点を取得する関数を定義する

原点座標、線分の長さ、角度(度単位)を入力として受け取り、指定された角度だけ回転させた垂直線の端点の xy 座標を返す関数を定義します。

def get_point_of_rotated_vertical(origin, line_length, degrees):
    """Return xy coordinates of the vertical line end rotated by degrees."""
    rad = np.deg2rad(-degrees)
    return [origin[0] + line_length * np.sin(rad),
            origin[1] + line_length * np.cos(rad)]

角度注釈付きのブラケット矢印を作成する

FancyArrowPatch を使って、角度注釈付きの 3 種類のブラケット矢印スタイルを作成します。各ブラケット矢印は、angleAangleB に対して異なる角度値を持ちます。また、角度注釈の位置を示すために垂直線も追加します。

style = ']-['
for i, angle in enumerate([-40, 0, 60]):
    y = 2*i
    arrow_centers = ((1, y), (5, y))
    vlines = ((1, y + 0.5), (5, y + 0.5))
    anglesAB = (angle, -angle)
    bracketstyle = f"{style}, angleA={anglesAB[0]}, angleB={anglesAB[1]}"
    bracket = FancyArrowPatch(*arrow_centers, arrowstyle=bracketstyle,
                              mutation_scale=42)
    ax.add_patch(bracket)
    ax.text(3, y + 0.05, bracketstyle, ha="center", va="bottom", fontsize=14)
    ax.vlines([line[0] for line in vlines], [y, y], [line[1] for line in vlines],
              linestyles="--", color="C0")

角度注釈用の矢印とテキストを追加する

各ブラケット矢印スタイルに角度注釈用の矢印とテキストを追加します。まず、angleAangleB における描画されたパッチの上部座標を取得します。次に、注釈用の矢印の接続方向を定義します。最後に、グラフに矢印と注釈用のテキストを追加します。

    ## Get the top coordinates for the drawn patches at A and B
    patch_tops = [get_point_of_rotated_vertical(center, 0.5, angle)
                  for center, angle in zip(arrow_centers, anglesAB)]
    ## Define the connection directions for the annotation arrows
    connection_dirs = (1, -1) if angle > 0 else (-1, 1)
    ## Add arrows and annotation text
    arrowstyle = "Simple, tail_width=0.5, head_width=4, head_length=8"
    for vline, dir, patch_top, angle in zip(vlines, connection_dirs,
                                            patch_tops, anglesAB):
        kw = dict(connectionstyle=f"arc3,rad={dir * 0.5}",
                  arrowstyle=arrowstyle, color="C0")
        ax.add_patch(FancyArrowPatch(vline, patch_top, **kw))
        ax.text(vline[0] - dir * 0.15, y + 0.7, f'{angle}°', ha="center",
                va="center")

グラフを表示する

plt.show() を使ってグラフを表示します。

plt.show()

まとめ

この実験では、Matplotlib の FancyArrowPatch を使って作成したブラケット矢印スタイルに角度注釈を追加する方法を学びました。また、特定のニーズに合うようにブラケット矢印スタイルをカスタマイズする方法も学びました。提供された手順とサンプルコードに従えば、自分自身の Matplotlib のグラフに角度注釈付きのブラケット矢印スタイルを作成できるようになったはずです。