我目前正在使用一个小的交互式 matplotlib 脚本,我想用它来标记图像中的不同事件。
为了使其更灵活,我想以一种方式创建它,我可以通过鼠标单击来选择事件(并且稍微改变我的光标的画笔大小,即相邻点的数量 - 选中)多边形内的或。
到目前为止,我设法通过左键单击并在我的绘图中绘制折线来为我选择的事件更改画笔大小。
from matplotlib import pyplot as plt
%matplotlib notebook
points = []
bs = 5 #brush size
def onclick(event):
global points
points.append([event.xdata, event.ydata])
if bs == 1:
ax.plot(event.xdata+bs, event.ydata+bs,'b+')
elif bs == 3:
ax.plot(event.xdata, event.ydata+1,'b+')
ax.plot(event.xdata, event.ydata-1,'b+')
ax.plot(event.xdata+1, event.ydata,'b+')
ax.plot(event.xdata-1, event.ydata,'b+')
ax.plot(event.xdata, event.ydata,'b+')
elif bs == 5:
ax.plot(event.xdata, event.ydata+1,'b+')
ax.plot(event.xdata, event.ydata-1,'b+')
ax.plot(event.xdata+1, event.ydata,'b+')
ax.plot(event.xdata-1, event.ydata,'b+')
ax.plot(event.xdata, event.ydata,'b+')
ax.plot(event.xdata, event.ydata+2,'b+')
ax.plot(event.xdata, event.ydata-2,'b+')
ax.plot(event.xdata+2, event.ydata,'b+')
ax.plot(event.xdata-2, event.ydata,'b+')
ax.plot(event.xdata+1, event.ydata+1,'b+')
ax.plot(event.xdata-1, event.ydata-1,'b+')
ax.plot(event.xdata+1, event.ydata-1,'b+')
ax.plot(event.xdata-1, event.ydata+1,'b+')
plt.draw()
class LineBuilder:
def __init__(self, line):
self.line = line
self.xs = list(line.get_xdata())
self.ys = list(line.get_ydata())
self.cid = line.figure.canvas.mpl_connect('button_press_event',self)
#self.cid = line.figure.canvas.mpl_connect('key_press_event', self)
def __call__(self, event):
#print('click', event)
if event.inaxes!=self.line.axes: return
self.xs.append(event.xdata)
self.ys.append(event.ydata)
self.line.set_data(self.xs, self.ys)
self.line.figure.canvas.draw()
return self
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_title(('click to build line segments. brush size %d; press button to paint') % bs)
line, = ax.plot(points, 'r+--')
linebuilder = LineBuilder(line)
plt.gcf().canvas.mpl_connect('key_press_event', onclick)
ax.set_xlim((0, 10))
ax.set_ylim((0, 10))
plt.show()
非常感谢提前!