Matplotlib を使ったルッキングガラスの作成

Beginner

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

はじめに

この実験では、Matplotlib を使ってマウスイベントを使ってルッキングガラス効果を作成する方法を学びます。この例では、クリックしてドラッグすることで移動できる円形の領域内のデータを調べることができます。

VM のヒント

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

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

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

必要なライブラリのインポート

Matplotlib ライブラリ、NumPy ライブラリ、および Matplotlib のパッチモジュールをインポートする必要があります。これらのライブラリを使って、ルッキングガラス効果を作成します。

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

ランダムなデータの生成

NumPy を使って、2 セットのランダムなデータを生成します。このデータをプロットして散布図を作成します。

## Fixing random state for reproducibility
np.random.seed(19680801)

x, y = np.random.rand(2, 200)

グラフと軸の作成

subplots() 関数を使って、グラフと軸のオブジェクトを作成します。また、patches.Circle() 関数を使って、軸のオブジェクトに黄色い円形のパッチを追加します。

fig, ax = plt.subplots()
circ = patches.Circle((0.5, 0.5), 0.25, alpha=0.8, fc='yellow')
ax.add_patch(circ)

データのプロット

手順 2 で生成したランダムなデータを、plot() 関数を使って 2 回プロットします。最初のプロットでは、透明度の値を 0.2 に設定し、2 番目のプロットでは、透明度の値を 1.0 に設定し、クリップパスを黄色い円形のパッチに設定します。

ax.plot(x, y, alpha=0.2)
line, = ax.plot(x, y, alpha=1.0, clip_path=circ)
ax.set_title("Left click and drag to move looking glass")

イベントハンドラの作成

黄色い円形のパッチをグラフの周りで移動させるために必要なマウスイベントを処理するイベントハンドラクラスを作成します。このクラスには、on_press()on_release()、および on_move() の 3 つのメソッドが含まれます。

class EventHandler:
    def __init__(self):
        fig.canvas.mpl_connect('button_press_event', self.on_press)
        fig.canvas.mpl_connect('button_release_event', self.on_release)
        fig.canvas.mpl_connect('motion_notify_event', self.on_move)
        self.x0, self.y0 = circ.center
        self.pressevent = None

    def on_press(self, event):
        if event.inaxes!= ax:
            return

        if not circ.contains(event)[0]:
            return

        self.pressevent = event

    def on_release(self, event):
        self.pressevent = None
        self.x0, self.y0 = circ.center

    def on_move(self, event):
        if self.pressevent is None or event.inaxes!= self.pressevent.inaxes:
            return

        dx = event.xdata - self.pressevent.xdata
        dy = event.ydata - self.pressevent.ydata
        circ.center = self.x0 + dx, self.y0 + dy
        line.set_clip_path(circ)
        fig.canvas.draw()

handler = EventHandler()
plt.show()

プログラムの実行

プログラムを実行し、黄色い円形のパッチを左クリックしてドラッグして、グラフの周りで移動させます。この効果を使って、円形の領域内のデータを調べることができます。

まとめ

この実験では、Matplotlib でマウスイベントを使ってルッキングガラス効果を作成する方法を学びました。ランダムなデータを生成し、データをプロットし、マウスイベントを処理するイベントハンドラクラスを作成しました。黄色い円形のパッチを左クリックしてドラッグすることで、グラフの周りで移動させ、円形の領域内のデータを調べることができました。