Я хочу сделать следующее, используя matplotlib:
-
Создайте линию между двумя точками, выполнив следующие действия: я. Дважды щелкните по холсту, используя кнопку "Влево" (созданная первая точка) II. Либо перетащите мышь в (или просто нажмите) вторую точку II. Проведите линию между первой и второй точкой.
-
Поместите зеленый (или любой другой цвет) круг на холст, выполнив следующие действия: я. Двойной щелчок на холсте с помощью кнопки RIGHT
-
Так как я, вероятно, ошибаюсь при двойном щелчке, я хочу иметь возможность выбрать построенный круг (или линию) и нажать кнопку удаления, чтобы удалить выбранный элемент.
Назад в старые добрые времена VB, это была 15-минутная работа. Потратив несколько часов на это, у меня кончились идеи.
Это то, что у меня есть до сих пор:
import matplotlib.pyplot as plt
class LineDrawer(object):
lines = []
def draw_line(self):
ax = plt.gca()
xy = plt.ginput(2)
x = [p[0] for p in xy]
y = [p[1] for p in xy]
line = plt.plot(x,y)
ax.figure.canvas.draw()
self.lines.append(line)
def onclick(event):
if event.dblclick:
if event.button == 1:
# Draw line
ld = LineDrawer()
ld.draw_line() # here you click on the plot
elif event.button == 3:
# Write to figure
plt.figtext(3, 8, 'boxed italics text in data coords', style='italic', bbox={'facecolor':'red', 'alpha':0.5, 'pad':10})
circ = plt.Circle((event.x, event.y), radius=0.07, color='g')
ax.add_patch(circ)
plt.draw()
else:
pass # Do nothing
def onpick(event):
thisline = event.artist
xdata = thisline.get_xdata()
ydata = thisline.get_ydata()
ind = event.ind
print ('onpick points:', zip(xdata[ind], ydata[ind]))
fig, ax = plt.subplots()
connection_id = fig.canvas.mpl_connect('button_press_event', onclick)
fig.canvas.mpl_connect('pick_event', onpick)
plt.tight_layout()
plt.show()
Помимо функции удаления, которой я еще не дошел до конца, почему мой код не выполняет требования 1 и 2?
Что я делаю неправильно?, что более важно, как я могу исправить код, чтобы получить требуемую функциональность?