Lasso Selector Demo Sgskip

Beginner

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

はじめに

この実験では、Python Matplotlib を使って、ローソーツールを使ってデータポイントを対話的に選択する方法を学びます。散布図を描画し、その後、グラフ上のポイントの周りにローソループを描いていくことでいくつかのポイントを選択します。描画するには、グラフ上をクリックして保持し、選択したいポイントの周りをドラッグします。

VM のヒント

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

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

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

ライブラリのインポート

必要なライブラリをインポートします。これには、numpyPath、およびLassoSelectorが含まれます。

import numpy as np
from matplotlib.path import Path
from matplotlib.widgets import LassoSelector

セレクタクラスの作成

LassoSelectorを使って Matplotlib コレクションからインデックスを選択するSelectFromCollectionクラスを作成します。

class SelectFromCollection:
    """
    `LassoSelector` を使って 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.lasso = LassoSelector(ax, onselect=self.onselect)
        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.lasso.disconnect_events()
        self.fc[:, -1] = 1
        self.collection.set_facecolors(self.fc)
        self.canvas.draw_idle()

散布図の作成

ランダムに生成されたデータを使って散布図を作成します。

np.random.seed(19680801)
data = np.random.rand(100, 2)

subplot_kw = dict(xlim=(0, 1), ylim=(0, 1), autoscale_on=False)
fig, ax = plt.subplots(subplot_kw=subplot_kw)
pts = ax.scatter(data[:, 0], data[:, 1], s=80)
selector = SelectFromCollection(ax, pts)

選択された点を受け付ける

エンターキーを使って選択された点を受け付け、コンソールに表示します。

def accept(event):
    if event.key == "enter":
        print("選択された点:")
        print(selector.xys[selector.ind])
        selector.disconnect()
        ax.set_title("")
        fig.canvas.draw()

fig.canvas.mpl_connect("key_press_event", accept)
ax.set_title("選択された点を受け付けるにはエンターキーを押してください。")

plt.show()

まとめ

この実験では、Python の Matplotlib を使って、ラソツールを使ってデータポイントを対話的に選択する方法を学びました。散布図を作成し、グラフ上の点の周りにラソループを描いていくつかの点を選択し、その後、エンターキーを使って選択された点を受け付けました。