Matplotlib - Создание нового графика из данных событий - PullRequest
1 голос
/ 29 января 2020

У меня есть точечная диаграмма, которая отображает аннотацию при наведении курсором мыши на точку. Я хочу добавить событие button_press_event, которое, когда пользователь нажимает на точку, помещает соответствующую выбранную строку r[2] и помещает ее в массив wordChosenList и воссоздает график рассеяния с правильными аннотациями. Для этого мне нужно знать 2 вещи:

  1. Как получить доступ к соответствующей выбранной строке r[2] изнутри newScatter()
  2. Я пытался установить r в качестве постоянных данных и смог получить новый график из моего кода. Однако мне не хватало всех аннотаций. Как мне получить их для новых данных?
  3. Этот метод 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()
...