У меня есть точечная диаграмма, которая отображает аннотацию при наведении курсором мыши на точку. Я хочу добавить событие button_press_event, которое, когда пользователь нажимает на точку, помещает соответствующую выбранную строку r[2]
и помещает ее в массив wordChosenList
и воссоздает график рассеяния с правильными аннотациями. Для этого мне нужно знать 2 вещи:
- Как получить доступ к соответствующей выбранной строке
r[2]
изнутри newScatter()
- Я пытался установить
r
в качестве постоянных данных и смог получить новый график из моего кода. Однако мне не хватало всех аннотаций. Как мне получить их для новых данных? - Этот метод newScatter должен был бы быть в состоянии выполнить и на графике с новыми данными.
PS: Не волнуйтесь примерно generateData(wordChosenList)
возвращает двумерный список длиной 4 (аналогично первой строке)
r = [[1,2,3][4,5,6],[5,5,5],["a","b","c"]]
wordChosenList = []
fig,ax = plt.subplots()
occurences=[[],[],[]]
sc = plt.scatter(r[0],r[1],c='#74DF00',edgecolors='#07190B', s=r[2], alpha=0.5)
annot = ax.annotate("", xy=(0,0), xytext=(20,20),textcoords="offset points",
bbox=dict(boxstyle="round", fc="w"),
arrowprops=dict(arrowstyle="->"))
annot.set_visible(False)
def update_annot(ind):
pos = sc.get_offsets()[ind["ind"][0]]
annot.xy = pos
text = "word: {}\n".format(" ".join([r[3][n] for n in ind["ind"]]))
annot.set_text(text)
annot.get_bbox_patch().set_facecolor('#F6CECE')
annot.get_bbox_patch().set_alpha(0.4)
def update_wordList(ind):
wordChosenList.append(names[range(len(ind["ind"]))])
def hover(event):
vis = annot.get_visible()
if event.inaxes == ax:
cont, ind = sc.contains(event)
if cont:
update_annot(ind)
annot.set_visible(True)
fig.canvas.draw_idle()
else:
if vis:
annot.set_visible(False)
fig.canvas.draw_idle()
def newScatter(event):
r = generateData(wordChosenList)
plt.clf()
sc = plt.scatter(r[0],r[1],c='#74DF00',edgecolors='#07190B', s=r[2], alpha=0.5)
annot = ax.annotate("", xy=(0,0), xytext=(20,20),textcoords="offset points", bbox=dict(boxstyle="round", fc="w"), arrowprops=dict(arrowstyle="->"))
annot.set_visible(False)
plt.draw()
fig.canvas.mpl_connect('button_press_event', newScatter)
fig.canvas.mpl_connect("motion_notify_event", hover)
plt.show()
plt.draw()