如何在Matplotlib pick_event中一次只选择一个点

时间:2017-05-02 15:25:22

标签: python matplotlib

我有一个Python脚本,用于绘制很多(n)行,每行10个点,我正在努力使它能够点击一行,它将打印行的id和id这一点。到目前为止,我已经得到了这个:

def onpick(event):
    ind = event.ind
    s = event.artist.get_gid()
    print s, ind

#x and y are n x 10 arrays
#s is the id of the line
for s in range(n):
    ax.plot(x[s,:],y[s,:],'^',color=colors(s),picker=2,gid=str(s))

工作正常并给我一个有点像这样的情节(我之前已将彩色框和颜色条放在适当位置以供参考): scatter plot of points

我可以点击某个点并打印出类似

的内容
1 [1]

**问题是这个 - **如果我点击非常接近的两个点之间打印

0 [2 3]

或类似的。我不能再进一步减少“选择器”的距离,因为这使得将鼠标放在正确的位置非常难以选择一个点。

我想要的是一种限制选择只能是最近点的方法。 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如果您只想打印最近点的索引,您需要找出哪一个最接近鼠标事件。

鼠标事件在数据坐标中的位置是通过event.mouseevent.xdata(或ydata)获得的。然后需要计算距离,并返回最接近的点的索引。

import numpy as np; np.random.seed(1)
import matplotlib.pyplot as plt

x = np.logspace(1,10,base=1.8)
y = np.random.rayleigh(size=(2,len(x)))

def onpick(event):
    ind = event.ind
    if len(ind) > 1:
        datax,datay = event.artist.get_data()
        datax,datay = [datax[i] for i in ind],[datay[i] for i in ind]
        msx, msy = event.mouseevent.xdata, event.mouseevent.ydata
        dist = np.sqrt((np.array(datax)-msx)**2+(np.array(datay)-msy)**2)
        ind = [ind[np.argmin(dist)]]
    s = event.artist.get_gid()
    print s, ind

colors=["crimson","darkblue"]
fig,ax = plt.subplots()
for s in range(2):
    ax.plot(x,y[s,:],'^',color=colors[s],picker=2,gid=str(s))

fig.canvas.mpl_connect("pick_event", onpick)

plt.show()