ポリゴンセレクタを使ってインデックスを選択する

Beginner

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

はじめに

この実験では、Matplotlib のポリゴンセレクタツールを使ってコレクションからインデックスを選択する方法を示します。ポリゴンセレクタツールを使うと、ユーザーはグラフ上の点を囲むポリゴンを描くことで点を選択できます。選択された点は強調表示され、選択されていない点は薄く表示されます。選択された点のインデックスは配列に保存され、その後の分析に使うことができます。

VM のヒント

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

Jupyter Notebook の読み込みには数秒かかる場合があります。Jupyter Notebook の制限により、操作の検証は自動化できません。

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

ライブラリのインポート

このステップでは、この実験に必要なライブラリをインポートします。データの操作と可視化には numpymatplotlib を使用します。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.path import Path
from matplotlib.widgets import PolygonSelector

データの作成

このステップでは、可視化するためのいくつかのデータを作成します。グリッド上の点の散布図を作成します。

fig, ax = plt.subplots()
grid_size = 5
grid_x = np.tile(np.arange(grid_size), grid_size)
grid_y = np.repeat(np.arange(grid_size), grid_size)
pts = ax.scatter(grid_x, grid_y)

セレクタクラスの定義

このステップでは、ポリゴンセレクタツールを使って散布図から点を選択できるクラスを定義します。このクラスは、選択された点のインデックスを配列に保存します。

class SelectFromCollection:
    """
    `PolygonSelector` を使って matplotlib のコレクションからインデックスを選択します。

    選択されたインデックスは `ind` 属性に保存されます。このツールは、選択の一部でない点を薄く表示します(つまり、それらのアルファ値を減らします)。コレクションのアルファ値が 1 未満の場合、このツールはアルファ値を恒久的に変更します。

    このツールは、コレクションオブジェクトをそれらの *原点*(つまり、`offsets`)に基づいて選択します。

    パラメータ
    ----------
    ax : `~matplotlib.axes.Axes`
        操作する Axes。
    collection : `matplotlib.collections.Collection` サブクラス
        選択するコレクション。
    alpha_other : 0 <= float <= 1
        選択を強調するために、このツールはすべての選択された点のアルファ値を 1 に設定し、選択されていない点のアルファ値を *alpha_other* に設定します。
    """

    def __init__(self, ax, collection, alpha_other=0.3):
        self.canvas = ax.figure.canvas
        self.collection = collection
        self.alpha_other = alpha_other

        self.xys = collection.get_offsets()
        self.Npts = len(self.xys)

        ## 各オブジェクトに別々の色があることを確認する
        self.fc = collection.get_facecolors()
        if len(self.fc) == 0:
            raise ValueError('コレクションには facecolor が必要です')
        elif len(self.fc) == 1:
            self.fc = np.tile(self.fc, (self.Npts, 1))

        self.poly = PolygonSelector(ax, self.onselect, draw_bounding_box=True)
        self.ind = []

    def onselect(self, verts):
        path = Path(verts)
        self.ind = np.nonzero(path.contains_points(self.xys))[0]
        self.fc[:, -1] = self.alpha_other
        self.fc[self.ind, -1] = 1
        self.collection.set_facecolors(self.fc)
        self.canvas.draw_idle()

    def disconnect(self):
        self.poly.disconnect_events()
        self.fc[:, -1] = 1
        self.collection.set_facecolors(self.fc)
        self.canvas.draw_idle()

セレクタオブジェクトの作成

このステップでは、3 つ目のステップで定義したセレクタクラスのインスタンスを作成します。これにより、ポリゴンセレクタツールを使って散布図から点を選択できるようになります。

selector = SelectFromCollection(ax, pts)

点の選択

このステップでは、ポリゴンセレクタツールを使って散布図から点を選択します。点の周りにポリゴンを描くことで点を選択できます。選択された点は強調表示され、選択されていない点は薄く表示されます。

print("Select points in the figure by enclosing them within a polygon.")
print("Press the 'esc' key to start a new polygon.")
print("Try holding the 'shift' key to move all of the vertices.")
print("Try holding the 'ctrl' key to move a single vertex.")
plt.show()

セレクタオブジェクトの切断

このステップでは、ポリゴンセレクタツールが使用するリソースを解放するために、セレクタオブジェクトを切断します。

selector.disconnect()

選択された点を表示する

このステップでは、選択された点の座標を表示します。

print('\nSelected points:')
print(selector.xys[selector.ind])

まとめ

この実験では、Matplotlib のポリゴンセレクタツールを使って散布図からインデックスを選択する方法を示します。セレクタクラスを使うと、ユーザーは点の周りにポリゴンを描くことで点を選択できます。選択された点は強調表示され、選択されていない点は薄く表示されます。選択された点のインデックスは配列に保存され、さらなる分析に使うことができます。