Nếu bạn đang làm việc với các nhóm điểm lớn, tôi khuyên bạn nên sử dụng CKDtrees
:
import matplotlib.pyplot as plt
import numpy as np
import scipy.spatial
points = np.column_stack([np.random.rand(50), np.random.rand(50)])
fig, ax = plt.subplots()
coll = ax.scatter(points[:,0], points[:,1])
ckdtree = scipy.spatial.cKDTree(points)
Tôi tái cấu trúc kpie's
câu trả lời ở đây một chút. Khi ckdtree
được tạo, bạn có thể xác định các điểm gần nhất ngay lập tức và nhiều loại thông tin khác nhau về chúng với một chút nỗ lực:
def closest_point_distance(ckdtree, x, y):
#returns distance to closest point
return ckdtree.query([x, y])[0]
def closest_point_id(ckdtree, x, y):
#returns index of closest point
return ckdtree.query([x, y])[1]
def closest_point_coords(ckdtree, x, y):
# returns coordinates of closest point
return ckdtree.data[closest_point_id(ckdtree, x, y)]
# ckdtree.data is the same as points
Hiển thị tương tác vị trí con trỏ.
Nếu bạn muốn tọa độ của điểm gần nhất được hiển thị trên Thanh công cụ Điều hướng:
def val_shower(ckdtree):
#formatter of coordinates displayed on Navigation Bar
return lambda x, y: '[x = {}, y = {}]'.format(*closest_point_coords(ckdtree, x, y))
plt.gca().format_coord = val_shower(ckdtree)
plt.show()
Sử dụng các sự kiện.
Nếu bạn muốn một loại tương tác khác, bạn có thể sử dụng các sự kiện:
def onclick(event):
if event.inaxes is not None:
print(closest_point_coords(ckdtree, event.xdata, event.ydata))
fig.canvas.mpl_connect('motion_notify_event', onclick)
plt.show()