Python 如何检查单击是否位于具有多个标记的散点图点(matplotlib)

Python 如何检查单击是否位于具有多个标记的散点图点(matplotlib),python,matplotlib,Python,Matplotlib,我有一个带有多个标记的散点图。如何更改代码,使其仍然可以检查是否单击图形上的某个点。变量行是什么 当然,两个散点图必须存储在不同的变量中。然后还可以将注释分为两部分,第一部分属于第一部分,第二部分属于第二部分。然后,您将对它们进行循环,并检查事件是否发生在它们中的任何一个 import matplotlib.pyplot as plt import numpy as np x = np.arange(20) y = np.sin(x) fig, ax = plt.subplots() lin

我有一个带有多个标记的散点图。如何更改代码,使其仍然可以检查是否单击图形上的某个点。变量行是什么


当然,两个散点图必须存储在不同的变量中。然后还可以将注释分为两部分,第一部分属于第一部分,第二部分属于第二部分。然后,您将对它们进行循环,并检查事件是否发生在它们中的任何一个

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(20)
y = np.sin(x)

fig, ax = plt.subplots()
line1 = ax.scatter(x[:10],y[:10],20, c="red", picker=True, marker='*')
line2 = ax.scatter(x[10:20],y[10:20],20, c="green", picker=True, marker='^')

ia = lambda i: plt.annotate("Annotate {}".format(i), (x[i],y[i]), visible=False)
img_annotations = [ia(i) for i in range(len(x))] 

lce = [False]
def show_ROI(event):
    tlce=False
    for annot, line in zip([img_annotations[:10],img_annotations[10:20]], [line1, line2]):
        if line.contains(event)[0]:
            lce[0]=tlce=True
            ind = line.contains(event)[1]["ind"]
            print('onpick3 scatter:', ind)
            ab = annot[ind[0]]
            ab.set_visible(True)
    if not tlce:
        for ab in img_annotations:
            ab.set_visible(False)
        lce[0] = False
    fig.canvas.draw_idle()

fig.canvas.mpl_connect('button_press_event', show_ROI)

plt.show()

谢谢你的回答。这是可行的,但其行为却出人意料。当我单击具有相同标记的标记时,注释会像应该的那样可见,但当我单击不同的标记时,先前选定点的注释会消失,因为两个标记的点具有相同的索引。您可能知道如何解决这个问题吗?因此,如果单击了另一个注释,所有注释都应该保持可见,而不依赖于哪个标记?如果在一个点外点击,所有的点击都会消失?是的,应该是这样的。可以吗?是的,我更新了代码,使用两个标志引导注释显示或不显示,这取决于单击发生的位置。非常感谢!!:我已经接受了你的答案,并投了赞成票。
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(20)
y = np.sin(x)

fig, ax = plt.subplots()
line1 = ax.scatter(x[:10],y[:10],20, c="red", picker=True, marker='*')
line2 = ax.scatter(x[10:20],y[10:20],20, c="green", picker=True, marker='^')

ia = lambda i: plt.annotate("Annotate {}".format(i), (x[i],y[i]), visible=False)
img_annotations = [ia(i) for i in range(len(x))] 

lce = [False]
def show_ROI(event):
    tlce=False
    for annot, line in zip([img_annotations[:10],img_annotations[10:20]], [line1, line2]):
        if line.contains(event)[0]:
            lce[0]=tlce=True
            ind = line.contains(event)[1]["ind"]
            print('onpick3 scatter:', ind)
            ab = annot[ind[0]]
            ab.set_visible(True)
    if not tlce:
        for ab in img_annotations:
            ab.set_visible(False)
        lce[0] = False
    fig.canvas.draw_idle()

fig.canvas.mpl_connect('button_press_event', show_ROI)

plt.show()