2012-07-18 16 views

cevap

25

Evet bu çerçeveyi ele Matplotlib etkinlikte sayesinde mümkündür. Özellikle yazdığınız bir şeyi daha önce yazdığım bir yazı bulamadım, bu yüzden bir tane yazdım (matplotlib kaynağına eklenmek üzere ileri süreceğim).

Ben en iyi ne olup bittiğini anlamak için iyice http://matplotlib.sourceforge.net/users/event_handling.html okurdu. Unutmayın ki "pick_event" mükemmel bir çözüm gibi geliyorsa da fare tıklamaları için değil, fare tıklamaları için değil, bu durumda işe yaramıyor.

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() 

Umarım her şey oldukça okunabilir olmalıdır: gibi çok güzel bir istesin nesneleştirilmiştirler olabilir

Kodum, görünüyor. kodun yüksek seviyede genel gider:

  • varsayılan olarak ek açıklama
  • bir işlev Kayıt görünmüyorsa [nokta, açıklama] çiftleri, bir listesini oluşturun, "on_move", her zaman çağrılacak fare hareketi algılandı
  • On_move işlevi her noktadan ve açıklamadan sonra yinelenir, eğer fare artık noktalardan birindeyse, ilişkili ek açıklamaları görünür yapmazsa, görünmez hale getirir.

Screenshot of the result

+0

Ah güzel (yöntem documented here olduğu içerir), kod ve açıklama için @pelson teşekkür ederim. Yani bu, arsa üzerinde bir konum üzerinde gezinmek için doğrudan olay işleyicisi olmadığı anlamına gelir. Dolaylı olarak yapılması gerekiyor. –

+0

Hayır. Fare olayının x ve y koordinatlarına 'on_move' işlevinde erişebilirsiniz. Ondan herşeyi yapabilirsin. Benim durumumda tüm sanatçılara baktım ve herhangi bir fare pozisyonunu içermediğimi belirledim, ancak tek bir açıklama örneğinin x ve y verilen pozisyonunu eşit olarak güncelleyebilirsiniz. – pelson

+0

Evet, bu noktada haklısınız, ama "hover_event" gibi bir etkinlikle belirli bir sanatçıya bir geri arama kaydettirmek gibi bir şey arıyordum. Bu, doğrudan bir etkinlik olan –