2012-07-18 8 views

答えて

25

はい、matplotlibのイベント処理フレームワークのおかげで可能です。私はあなたが特に興味を持っているように既に書かれた例を見つけることができませんでしたので、私はそれを書きました(私はmatplotlibソースに含めることを前提にしています)。

私はhttp://matplotlib.sourceforge.net/users/event_handling.htmlをよく読んで、何が起こっているのかをよく理解しています。完璧なソリューション "pick_event"のように聞こえるが、マウスオーバーイベントではなく、この場合は動作しないことに注意してください。

1が望むべきで非常にうまくオブジェクト化することができ私のコードは、次のようになります。うまくいけば、すべてがかなり読めるべきである

import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = plt.axes() 


points_with_annotation = [] 
for i in range(10): 
    point, = plt.plot(i, i, 'o', markersize=10) 

    annotation = ax.annotate("Mouseover point %s" % i, 
     xy=(i, i), xycoords='data', 
     xytext=(i + 1, i), textcoords='data', 
     horizontalalignment="left", 
     arrowprops=dict(arrowstyle="simple", 
         connectionstyle="arc3,rad=-0.2"), 
     bbox=dict(boxstyle="round", facecolor="w", 
        edgecolor="0.5", alpha=0.9) 
     ) 
    # by default, disable the annotation visibility 
    annotation.set_visible(False) 

    points_with_annotation.append([point, annotation]) 


def on_move(event): 
    visibility_changed = False 
    for point, annotation in points_with_annotation: 
     should_be_visible = (point.contains(event)[0] == True) 

     if should_be_visible != annotation.get_visible(): 
      visibility_changed = True 
      annotation.set_visible(should_be_visible) 

    if visibility_changed:   
     plt.draw() 

on_move_id = fig.canvas.mpl_connect('motion_notify_event', on_move) 

plt.show() 

。コードのハイレベルな概要は行く:

  • デフォルトで注釈が毎回呼ばれるように、「on_move」、関数を登録
  • 表示されていない場合は、[ポイント、注釈]ペアのリストを作成します。マウスの動きが検出されました
  • on_move関数は、各点と注釈を繰り返し処理します。マウスがポイントの1つ上にある場合は、関連付けられた注釈を表示し、そうでない場合は不可視にします。

Screenshot of the result

+0

ああ素敵(メソッドがdocumented hereで含まれている)、コードと説明のためにあなたを@pelson感謝。つまり、プロット上のある場所にホバーするための直接イベントハンドラはありません。間接的に行う必要があります。 –

+0

いいえon_move関数でマウスイベントのx座標とy座標にアクセスできます。それで何かをすることができます。私の場合、私はすべてのアーティストを見て、マウスの位置が含まれているかどうかを確認しましたが、xとyを指定すると、単一の注釈インスタンスの位置を均等に更新できます。 – pelson

+0

ええ、そういう意味ですが、特定のアーティストにコールバックを登録するようなものを探していました。「hover_event」のようなイベントがあります。それは私が直接イベントで意味するものです –

関連する問題