了解matplotlib事件处理:什么是事件和mpl_connect?

时间:2017-03-02 10:59:08

标签: python matplotlib

我希望能够在我的散点图中按下一个点时显示值。解决方案在此处找到:Possible to make labels appear when hovering over a point in matplotlib?

解决方案:

from matplotlib.pyplot import figure, show
import numpy as npy
from numpy.random import rand


# picking on a scatter plot (matplotlib.collections.RegularPolyCollection)

x, y, c, s = rand(4, 100)
def onpick3(event):
    ind = event.ind
    print 'onpick3 scatter:', ind, npy.take(x, ind), npy.take(y, ind)

fig = figure()
ax1 = fig.add_subplot(111)
col = ax1.scatter(x, y, 100*s, c, picker=True)
#fig.savefig('pscoll.eps')
fig.canvas.mpl_connect('pick_event', onpick3)

show()

它解决了我的问题。但我不明白,我一直在谷歌搜索没有运气。我知道如何用matplotlib绘图,所以这不是我缺乏的知识。

我不明白的一件事是onpick3(event)功能。这个事件参数是什么?因为函数本身在没有任何给定参数的情况下被进一步调用:fig.canvas.mpl_connect('pick_event', onpick)

1 个答案:

答案 0 :(得分:2)

mpl_connect将信号连接到插槽。在这种情况下,插槽onpick3 请注意,未调用该广告位,即the syntax

fig.canvas.mpl_connect('pick_event', onpick3)
fig.canvas.mpl_connect('pick_event', onpick3())

只有在触发信号时才会调用它(鼠标在画布上单击)。此时,底层event作为函数调用中的参数提供。

一旦你尝试定义没有参数的插槽,你会看到。这会导致类似onpick3 expects 0 arguments but got 1左右的错误。

您可以在matplotlib event handling页面上找到详细信息。 event本身就是matplotlib.backend_bases.PickEvent的一个实例。 .ind属性没有详细记录,但主要是因为并非所有艺术家都将此属性注册到事件中。