我有一个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))
工作正常并给我一个有点像这样的情节(我之前已将彩色框和颜色条放在适当位置以供参考):
我可以点击某个点并打印出类似
的内容1 [1]
**问题是这个 - **如果我点击非常接近的两个点之间打印
0 [2 3]
或类似的。我不能再进一步减少“选择器”的距离,因为这使得将鼠标放在正确的位置非常难以选择一个点。
我想要的是一种限制选择只能是最近点的方法。 有什么想法吗?
答案 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()