2012-07-18 11 views

Odpowiedz

25

Tak, jest to możliwe dzięki ramom obsługi zdarzeń matplotlib. Nie mogłem znaleźć już napisanego przykładu, który robi to, co cię szczególnie interesuje, więc napisałem jeden (który przedstawię do włączenia w źródło matplotlib).

Przeczytałbym http://matplotlib.sourceforge.net/users/event_handling.html dokładnie, aby jak najlepiej zrozumieć, co się dzieje. Należy pamiętać, że chociaż brzmi to jak idealne rozwiązanie "pick_event" to kliknięcia myszą - nie dotyczy over-events myszy i nie działa w tym przypadku.

Mój kod, który może być zobiektywizowane bardzo ładnie powinno chcieć, wygląda następująco:

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

Mam nadzieję, że wszystko powinno być dość czytelny. Przegląd danych wysoki poziom kodu idzie:

  • Tworzenie listy [punktowych, adnotacji] parach, gdzie domyślnie adnotacja nie jest widoczny
  • Zarejestruj funkcję „on_move”, aby być wywoływana za każdym razem wykrywany jest ruch myszy
  • Funkcja on_move iteruje przez każdy punkt i adnotację, jeśli mysz znajduje się teraz nad jednym z punktów, przypisz mu skojarzony komentarz, jeśli nie jest, spraw, aby był niewidoczny. (Contains metoda jest documented here)

Screenshot of the result

+0

Ach piękne, dziękuję @pelson kodu i wyjaśnienia. Oznacza to, że nie ma bezpośredniej procedury obsługi zdarzenia do zawisu nad lokalizacją na działce. To musi być zrobione pośrednio. –

+0

Nie. Można uzyskać dostęp do współrzędnych X i Y zdarzenia myszy w funkcji 'on_move'. Od tego możesz zrobić wszystko. W moim przypadku przejrzałem wszystkich artystów i zidentyfikowaliśmy, czy jakiekolwiek zawierają pozycję myszy, ale można również zaktualizować pozycję pojedynczej instancji adnotacji, biorąc pod uwagę x i y. – pelson

+0

Tak, masz rację, ale szukałem czegoś takiego, jak zarejestrowanie wywołania zwrotnego do konkretnego wykonawcy za pomocą zdarzenia typu "hover_event". Tak właśnie rozumiem przez bezpośrednie zdarzenie –

Powiązane problemy