【发布时间】:2012-07-17 06:03:35
【问题描述】:
我想知道如何在底图绘图中创建一个弹出框。当我将鼠标悬停在某个位置上时,它应该会触发弹出框。
这可能吗?
【问题讨论】:
标签: python events popup matplotlib matplotlib-basemap
我想知道如何在底图绘图中创建一个弹出框。当我将鼠标悬停在某个位置上时,它应该会触发弹出框。
这可能吗?
【问题讨论】:
标签: python events popup matplotlib matplotlib-basemap
是的,这要归功于 matplotlib 的事件处理框架。我找不到一个已经写好的例子来做你特别感兴趣的事情,所以我写了一个(我会提出包含在 matplotlib 源代码中)。
我会仔细阅读http://matplotlib.sourceforge.net/users/event_handling.html 以最好地了解正在发生的事情。请注意,虽然听起来完美的解决方案“pick_event”是针对鼠标点击而不是针对鼠标悬停事件,并且在这种情况下不起作用。
我的代码可以很好地客观化,应该是这样的:
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 函数中访问鼠标事件的 x 和 y 坐标。从那你可以做任何事情。在我的情况下,我查看了所有艺术家并确定是否有任何包含鼠标位置,但你可以同样更新单个注释实例的位置给定 x 和 y。