本文介绍了Matplotlib 底图:弹出框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to know how to create a popup box in a basemap plot. When I hover my mouse over a location , it should trigger the popup box.

这可能吗?

推荐答案

是的,这要归功于 matplotlib 的事件处理框架.我找不到一个已经写好的例子来做你特别感兴趣的事情,所以我写了一个(我将提出来包含在 matplotlib 源代码中).

Yes it is possible thanks to matplotlib's event handling framework. I couldn't find an already written example which does what you are particularly interested in so I wrote one (which I will put forward for inclusion in the matplotlib source).

我会阅读 http://matplotlib.sourceforge.net/users/event_handling.html 彻底了解正在发生的事情.请注意,虽然听起来完美的解决方案pick_event"是针对鼠标点击 - 而不是针对鼠标悬停事件,并且在这种情况下不起作用.

I would read http://matplotlib.sourceforge.net/users/event_handling.html thoroughly to best understand what is going on. Please note that although it sounds like the perfect solution "pick_event" is for mouse clicks -not for mouse over- events and doesn't work in this case.

我的代码,如果需要,可以很好地对象化,看起来像:

My code, which could be objectified very nicely should one want, looks like:

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

希望一切都应该是相当可读的.代码的高级概述如下:

Hopefully everything should be fairly readable. A high level overview of the code goes:

  • 创建一个 [point, annotation] 对列表,其中默认情况下注释不可见
  • 注册一个函数on_move",在每次检测到鼠标移动时调用
  • on_move 函数遍历每个点和注释,如果鼠标现在位于其中一个点上,则使其关联的注释可见,如果不是,则使其不可见.(包含方法在此处记录)

这篇关于Matplotlib 底图:弹出框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-05 20:16
查看更多