質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1801閲覧

Visual Studio Codeでmatplotlibのコールバック関数が機能しない

yamatan

総合スコア8

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/09/08 08:39

前提・実現したいこと

Pythonのmatplotlibの図の中でオブジェクトがクリックされたかどうか確認したいです。

発生している問題・エラーメッセージ

以下のコードのように、matplotlibのfigureの.canvas.mpl_connect()関数にクリックイベントを紐づけたのですが、意図して動作をせず、図内のオブジェクトをクリックしても紐づけた関数が実行されません。

該当のソースコード

Python

1import matplotlib.pyplot as plt 2import numpy as np 3 4def click(event): 5 print('clicked object') 6 7x = np.random.randn(100) 8y = np.random.randn(100) 9 10fig = plt.figure() 11fig.canvas.mpl_connect('pick_event', click) 12plt.xlabel("x") 13plt.ylabel("y") 14plt.scatter(x, y) 15plt.show()

補足情報(FW/ツールのバージョンなど)

環境は
Visual Studio Code 1.60.0
Python 3.6.8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

pick_eventは、対象となるオブジェクトのpickerプロパティがNoneの場合には発生しません。

Pick Event Demo — Matplotlib 3.4.3 documentation

pickerプロパティの初期値はNoneなので、利用者がTrueに変更してください。例えば、Scatterを生成するときに、オプション引数で指定します。

diff

1-plt.scatter(x, y) 2+plt.scatter(x, y, picker=True, pickradius=2.5)

pickradiusを指定すると、各ポイントを中心とする、pick_eventを発生させる円の半径を変更できます。
設定しなくてもそれなりの大きさになっていますが、ちょっと広めだったので、ここではScatterの円マーカーの大きさ(面積)の初期値20に対応する、おおよその半径2.5を設定しています。

あとは、紐付けた関数clickの内部で、

Python

1def click(event): 2 if isinstance(event.artist, PathCollection): 3 print(f"clicked {len(event.ind)} point{'s' if len(event.ind) > 1 else ''}") 4 for i in event.ind: 5 print(f" point[{i:3d}]: ({x[i]:10.7f}, {y[i]:10.7f})") 6 else: 7 print('clicked object')

のように、eventオブジェクトを使って、クリックした点の情報(インデックスや座標など)を得ることができます。なお、マーカーが重なっているような場合は、複数の点のインデックスが得られます。

投稿2021/09/09 01:07

編集2021/09/09 01:19
Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamatan

2021/09/09 05:37

ありがとうございます、やりたいことができました。 教えて頂いた後に調べてみると、matplotlibの公式ドキュメント (https://matplotlib.org/stable/gallery/event_handling/pick_event_demo.html) にも書いてあるようで、私のリサーチ不足でした。 コードの参考例をありがとうございます。pickされたポイントが複数ある場合は、クリックした座標に一番近い点を表示することで対応できそうです。 参考になりました。 改めてありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問