Python Matplotlib基本映射:弹出框

Python Matplotlib基本映射:弹出框,python,events,popup,matplotlib,matplotlib-basemap,Python,Events,Popup,Matplotlib,Matplotlib Basemap,我想知道如何在底图绘图中创建弹出框。当我将鼠标悬停在某个位置上时,它会触发弹出框 这可能吗?是的,由于matplotlib的事件处理框架,这是可能的。我找不到一个已经编写好的示例,它可以实现您特别感兴趣的功能,因此我编写了一个示例(我将在matplotlib源代码中提供) 我会仔细阅读,以最好地了解正在发生的事情。请注意,尽管“pick_事件”听起来像是一个完美的解决方案,但它适用于鼠标点击,而不是鼠标悬停事件,在这种情况下不起作用 如果需要,我的代码可以很好地对象化,如下所示: import

我想知道如何在底图绘图中创建弹出框。当我将鼠标悬停在某个位置上时,它会触发弹出框


这可能吗?

是的,由于matplotlib的事件处理框架,这是可能的。我找不到一个已经编写好的示例,它可以实现您特别感兴趣的功能,因此我编写了一个示例(我将在matplotlib源代码中提供)

我会仔细阅读,以最好地了解正在发生的事情。请注意,尽管“pick_事件”听起来像是一个完美的解决方案,但它适用于鼠标点击,而不是鼠标悬停事件,在这种情况下不起作用

如果需要,我的代码可以很好地对象化,如下所示:

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函数遍历每个点和注释,如果鼠标现在位于其中一个点上,则使其关联的注释可见,如果不可见,则使其不可见。(contains方法为)

啊,太好了,谢谢@pelson的代码和解释。因此,这意味着没有直接的事件处理程序用于将鼠标悬停在绘图上的某个位置上。这需要间接进行,不。您可以在移动时访问鼠标事件的x和y坐标。从那你可以做任何事。在我的例子中,我查看了所有的美工人员,并确定了是否有任何美工人员包含鼠标位置,但您可以在给定x和y的情况下同等地更新单个注释实例的位置。是的,您在这一点上是正确的,但我正在寻找类似于向特定美工人员注册回调的内容,例如“hover\u event”这就是我所说的直接事件的意思。不,我不知道。这是一个很好的功能,必须能够打开(但如果总是检查,可能会影响性能…)。希望这对您有所帮助。感谢@pelson提供的解决方案。我只是好奇,如果ax是极坐标图,为什么注释会表现得很奇怪。我正在使用您的精确解决方案在极坐标图上添加注释,但是,实际上只显示了注释的一个子集(即使它们都是创建的,并且对onmove事件作出反应)。我在这里发布了一个问题-(简化了事件处理程序)。提前感谢您提供的任何帮助!