Как нарисовать только одну, самую новую точку, выбранную pick_event? - PullRequest
0 голосов
/ 09 мая 2019

Я хочу выбрать (добавить) маркер к кривой.Маркер может многократно менять положение, однако в конечном итоге мне нужно нанести только самый новый (обновленный) маркер и удалить старый.Есть идеи?

import matplotlib.pyplot as plt
import numpy as np

fig, ax1 = plt.subplots()
t = np.arange(0.0, 1.0, 0.01)
s = np.sin(2 * 2 * np.pi * t)for i in range(10):
pt, = ax1.plot(t, s, picker=5)


def onpick(event):

    if event.artist != pt:
        return True
    if not len(event.ind):
        return True
    ind = event.ind[0]
    ax1.plot(t[ind], s[ind], '|r', markersize='20')
    fig.canvas.draw()
    return True


fig.canvas.mpl_connect('pick_event', onpick)
plt.show()

1 Ответ

0 голосов
/ 09 мая 2019

Вместо вызова нового plot() и создания нового исполнителя при каждом клике, просто создайте пустого исполнителя на этапе инициализации и обновите его координаты в onpick():

import matplotlib.pyplot as plt
import numpy as np

fig, ax1 = plt.subplots()
t = np.arange(0.0, 1.0, 0.01)
s = np.sin(2 * 2 * np.pi * t)
pt, = ax1.plot(t, s, picker=5)
mark, = ax1.plot([], [], '|r', markersize='20')


def onpick(event):
    if event.artist != pt:
        return True
    if not len(event.ind):
        return True
    ind = event.ind[0]
    mark.set_data(t[ind], s[ind])
    fig.canvas.draw()
    return True


fig.canvas.mpl_connect('pick_event', onpick)
plt.show()

РЕДАКТИРОВАТЬ: тот же принцип, используя N кривых и N маркеров

import matplotlib.pyplot as plt
import numpy as np

fig, ax1 = plt.subplots()
t = np.arange(0.0, 1.0, 0.01)
ss = [np.sin(2 * 2 * np.pi * t),
      np.cos(3 * 2 * np.pi * t),
      np.sin(0.5 * 2 * np.pi * t)]
cs = ['b','r', 'g']
ms = ['|','o','D']
lines = [ax1.plot(t,s,'-',color=c, picker=5)[0] for s,c in zip(ss,cs)]
markers = [ax1.plot([],[],lw=0, marker=m, ms=20, color=c)[0] for m,c in zip(ms,cs)]

def onpick(event):
    point_idx = event.ind[0]
    art_idx = None
    for i,l in enumerate(lines):
        if event.artist == l:
            art_idx = i
            break
    if art_idx is not None:
        markers[art_idx].set_data(t[point_idx], ss[art_idx][point_idx])
    fig.canvas.draw()
    return True


fig.canvas.mpl_connect('pick_event', onpick)
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...