サイトアイコン ITC Media

matplotlibのpatchesで図形描画!使い方と実例を徹底解説

(最終更新月: 2024年11月)

✔こんな方におすすめの記事です

「matplotlibで図形を描きたいけど、patchesの使い方がわからない」
「図形を自由に描画して、グラフをもっと見やすくしたい」
「patchesを使った実践的な描画方法を知りたい」

✔当記事を通じて得られること

当記事では、matplotlibのpatchesの基本から応用まで、実例を交えて幅広く解説していきます。
ぜひ最後までご覧ください。

matplotlibのpatchesとは

matplotlibのpatchesは、グラフや図形を描画するための重要な機能です。
図形描画の基本となるため、matplotlibを使いこなすには避けて通れない知識となります。

patchesの基本概念

patchesは、matplotlibで図形を描画するための機能群です。
円や四角形、矢印などの基本的な図形を、簡単なコードで描けるようになっています。
以下が基本的な使い方の例です。

import matplotlib.pyplot as plt
import matplotlib.patches as patches

fig, ax = plt.subplots()
rect = patches.Rectangle((0.2, 0.3), 0.4, 0.2, color='red')
ax.add_patch(rect)
plt.show()

図形描画の仕組み

patchesは、図形オブジェクトを作成し、それをAxesに追加する仕組みで動作します。
この方法により、複数の図形を重ねたり、位置を調整したりすることができるのです。
例えば、以下のように複数の図形を描画できます。

import matplotlib.pyplot as plt
import matplotlib.patches as patches

fig, ax = plt.subplots()
circle = patches.Circle((0.5, 0.5), 0.2, color='blue')
rect = patches.Rectangle((0.2, 0.2), 0.3, 0.3, color='red')
ax.add_patch(circle)
ax.add_patch(rect)
plt.show()

patchesの特徴と利点

patchesは、図形の色や透明度、線の種類など、さまざまな属性をカスタマイズできます。
このような柔軟性により、必要に応じて図形の見た目を調整することができるのです。
以下は、スタイルをカスタマイズした例です。

rect = patches.Rectangle(
    (0.2, 0.2),
    0.3,
    0.3,
    facecolor='red',
    edgecolor='black',
    alpha=0.5,
    linestyle='--'
)

基本的な図形の描画方法

patchesを使って基本的な図形を描画する方法を説明します。
まずは、よく使用される図形の描き方をマスターしましょう。

四角形の描画

四角形は、Rectangleクラスを使って描画します。
位置と大きさを指定することで、簡単に四角形を作成できます。
以下が基本的な使用例です。

import matplotlib.pyplot as plt
import matplotlib.patches as patches

fig, ax = plt.subplots()
rect = patches.Rectangle(
    (0.2, 0.2),    # 左下の座標
    0.4,           # 幅
    0.3,           # 高さ
    facecolor='blue'
)
ax.add_patch(rect)
plt.axis([0, 1, 0, 1])  # グラフの表示範囲
plt.show()

円の描画

円は、Circleクラスを使って描画します。
中心座標と半径を指定することで、円を描くことができます。
以下のコードで円を描画できます。

import matplotlib.pyplot as plt
import matplotlib.patches as patches

fig, ax = plt.subplots()
circle = patches.Circle(
    (0.5, 0.5),    # 中心座標
    0.2,           # 半径
    facecolor='red'
)
ax.add_patch(circle)
plt.axis([0, 1, 0, 1])
plt.show()

矢印の描画

矢印は、Arrowクラスを使って描画します。
始点と終点の座標、矢印の幅などを指定して描画することができます。
以下が矢印を描く基本的なコードです。

import matplotlib.pyplot as plt
import matplotlib.patches as patches

fig, ax = plt.subplots()
arrow = patches.Arrow(
    0.2, 0.2,      # 始点の座標
    0.3, 0.3,      # 矢印の方向とサイズ
    width=0.1,     # 矢印の幅
    color='green'
)
ax.add_patch(arrow)
plt.axis([0, 1, 0, 1])
plt.show()

図形のカスタマイズ

patchesで作成した図形は、さまざまな方法でカスタマイズできます。
見やすく効果的な図を作成するために、カスタマイズの方法を理解しましょう。

色の設定

図形の色は、facesolor(塗りつぶし色)とedgecolor(枠線の色)で設定できます。
色は文字列や RGB 値で指定することができます。
以下のコードで、色の設定方法を確認できます。

import matplotlib.pyplot as plt
import matplotlib.patches as patches

fig, ax = plt.subplots()
rect = patches.Rectangle(
    (0.2, 0.2),
    0.4,
    0.3,
    facecolor='#FF0000',  # 赤色
    edgecolor='#0000FF'   # 青色
)
ax.add_patch(rect)
plt.show()

透明度の調整

透明度は、alpha パラメータで設定します。
0(完全に透明)から1(完全に不透明)までの値で指定できます。
以下のコードで、透明度を設定できます。

import matplotlib.pyplot as plt
import matplotlib.patches as patches

fig, ax = plt.subplots()
circle1 = patches.Circle((0.4, 0.5), 0.2, color='red', alpha=0.5)
circle2 = patches.Circle((0.6, 0.5), 0.2, color='blue', alpha=0.5)
ax.add_patch(circle1)
ax.add_patch(circle2)
plt.show()

線のスタイル設定

線のスタイルは、linestyle パラメータで設定します。
実線、破線、点線などを指定することができます。
以下が線のスタイルを設定する例です。

import matplotlib.pyplot as plt
import matplotlib.patches as patches

fig, ax = plt.subplots()
rect1 = patches.Rectangle((0.1, 0.1), 0.3, 0.2, linestyle='-', fill=False)
rect2 = patches.Rectangle((0.1, 0.4), 0.3, 0.2, linestyle='--', fill=False)
rect3 = patches.Rectangle((0.1, 0.7), 0.3, 0.2, linestyle=':', fill=False)
ax.add_patch(rect1)
ax.add_patch(rect2)
ax.add_patch(rect3)
plt.show()

複雑な図形の作成

複数の図形を組み合わせることで、より複雑な図形を作成できます。
実践的な使用例を見ながら、応用的な図形の作成方法を学びましょう。

図形の組み合わせ

複数の図形を組み合わせることで、より複雑な図形を表現できます。
それぞれの図形の位置や大きさを調整することが重要です。
以下のコードで家の形を作成してみましょう。

import matplotlib.pyplot as plt
import matplotlib.patches as patches

fig, ax = plt.subplots()
# 家の本体(四角形)
house = patches.Rectangle((0.3, 0.2), 0.4, 0.3, facecolor='brown')
# 屋根(三角形)
roof = patches.Polygon(
    [[0.2, 0.5], [0.5, 0.8], [0.8, 0.5]],
    facecolor='red'
)
# 窓(四角形)
window = patches.Rectangle((0.4, 0.3), 0.1, 0.1, facecolor='skyblue')

ax.add_patch(house)
ax.add_patch(roof)
ax.add_patch(window)
plt.axis([0, 1, 0, 1])
plt.show()

パスの作成

パスを使用すると、より自由な形状を描画できます。
複数の点を結んで、独自の形状を作成することができます。
以下が星形を描く例です。

import matplotlib.pyplot as plt
import matplotlib.patches as patches
import numpy as np

fig, ax = plt.subplots()
# 星形の頂点を計算
n_points = 5
angles = np.linspace(0, 2*np.pi, n_points, endpoint=False)
outer_radius = 0.3
inner_radius = 0.15
center = [0.5, 0.5]

outer_points = [
    [center[0] + outer_radius*np.cos(angle),
     center[1] + outer_radius*np.sin(angle)]
    for angle in angles
]
inner_points = [
    [center[0] + inner_radius*np.cos(angle + np.pi/n_points),
     center[1] + inner_radius*np.sin(angle + np.pi/n_points)]
    for angle in angles
]

points = []
for i in range(n_points):
    points.append(outer_points[i])
    points.append(inner_points[i])

star = patches.Polygon(points, facecolor='yellow')
ax.add_patch(star)
plt.axis([0, 1, 0, 1])
plt.show()

複雑な形状の描画

より複雑な形状は、複数の基本図形を組み合わせて作成します。
位置関係や大きさのバランスを考慮しながら描画することが大切です。
以下は顔を描く例です。

import matplotlib.pyplot as plt
import matplotlib.patches as patches

fig, ax = plt.subplots()
# 顔(大きな円)
face = patches.Circle((0.5, 0.5), 0.3, facecolor='#FFE4C4')
# 左目
left_eye = patches.Circle((0.4, 0.6), 0.05, facecolor='white')
left_pupil = patches.Circle((0.4, 0.6), 0.02, facecolor='black')
# 右目
right_eye = patches.Circle((0.6, 0.6), 0.05, facecolor='white')
right_pupil = patches.Circle((0.6, 0.6), 0.02, facecolor='black')
# 口(楕円)
mouth = patches.Ellipse((0.5, 0.4), 0.2, 0.1, facecolor='red')

for p in [face, left_eye, left_pupil, right_eye, right_pupil, mouth]:
    ax.add_patch(p)

plt.axis([0, 1, 0, 1])
plt.show()

実践的な使用例

patchesの実践的な使用例を見ていきましょう。
実際のデータ可視化や図形描画に役立つ例を紹介します。

グラフの強調表示

グラフの特定の部分を強調表示する方法を説明します。
矩形や円を使って、注目してほしい部分を強調することができます。
以下のコードで、データの特定範囲を強調表示してみましょう。

import matplotlib.pyplot as plt
import matplotlib.patches as patches
import numpy as np

# データの作成
x = np.linspace(0, 10, 100)
y = np.sin(x)

fig, ax = plt.subplots()
# グラフの描画
ax.plot(x, y)

# 強調したい範囲を矩形で囲む
highlight = patches.Rectangle(
    (3, -0.5),     # 左下の座標
    2, 1,          # 幅と高さ
    facecolor='yellow',
    alpha=0.3
)
ax.add_patch(highlight)

plt.show()

図形によるアノテーション

図形を使って、グラフに注釈を付け加えることができます。
矢印や吹き出しなどを使って、データの説明を加えることができます。
以下が注釈を付けた例です。

import matplotlib.pyplot as plt
import matplotlib.patches as patches

fig, ax = plt.subplots()
# 基本的なプロット
ax.scatter([0.5], [0.5], color='red')

# 注釈用の矢印
arrow = patches.FancyArrowPatch(
    (0.7, 0.7),    # 始点
    (0.52, 0.52),  # 終点
    arrowstyle='->',
    mutation_scale=20
)
# 注釈用の四角形
note_box = patches.Rectangle(
    (0.7, 0.7),
    0.2,
    0.1,
    facecolor='white',
    edgecolor='black'
)

ax.add_patch(arrow)
ax.add_patch(note_box)
ax.text(0.72, 0.73, '重要な点')

plt.axis([0, 1, 0, 1])
plt.show()

データの視覚化

patchesを使って、データを視覚的に表現することができます。
円や四角形の大きさを使って、データの値を表現する方法を紹介します。
以下がバブルチャートの例です。

import matplotlib.pyplot as plt
import matplotlib.patches as patches
import numpy as np

fig, ax = plt.subplots()

# データの作成
data = [
    {'x': 0.3, 'y': 0.3, 'value': 0.15},
    {'x': 0.5, 'y': 0.5, 'value': 0.25},
    {'x': 0.7, 'y': 0.7, 'value': 0.2}
]

# データを円の大きさで表現
for d in data:
    circle = patches.Circle(
        (d['x'], d['y']),
        d['value'],
        facecolor='blue',
        alpha=0.3
    )
    ax.add_patch(circle)

plt.axis([0, 1, 0, 1])
plt.show()

まとめ

当記事では、matplotlibのpatchesについて学習してきました。

patchesの基本を理解することで、より魅力的なデータの可視化が可能になります。
ここで学んだ技術を活用して、自分のデータをより効果的に表現してみましょう。
実際のプロジェクトで活用することで、さらなるスキルアップにつながることでしょう。

モバイルバージョンを終了