Chcę wiedzieć, jak utworzyć wyskakujące okienko na wykresie mapy bazowej. Po najechaniu kursorem myszki nad lokalizację, powinna ona wywołać wyskakujące okienko.Mapa bazowa Matplotlib: Pole wyskakujące
Czy to możliwe?
Chcę wiedzieć, jak utworzyć wyskakujące okienko na wykresie mapy bazowej. Po najechaniu kursorem myszki nad lokalizację, powinna ona wywołać wyskakujące okienko.Mapa bazowa Matplotlib: Pole wyskakujące
Czy to możliwe?
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:
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. –
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
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 –