はじめに
この実験では、Python Matplotlib を使って、ローソーツールを使ってデータポイントを対話的に選択する方法を学びます。散布図を描画し、その後、グラフ上のポイントの周りにローソループを描いていくことでいくつかのポイントを選択します。描画するには、グラフ上をクリックして保持し、選択したいポイントの周りをドラッグします。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習します。
時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証は自動化できません。
学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
ライブラリのインポート
必要なライブラリをインポートします。これには、numpy、Path、および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 を使って、ラソツールを使ってデータポイントを対話的に選択する方法を学びました。散布図を作成し、グラフ上の点の周りにラソループを描いていくつかの点を選択し、その後、エンターキーを使って選択された点を受け付けました。