我要使用matplotlib执行以下操作:
通过执行以下操作,在两点之间创建一条直线: i、 使用左键双击画布(创建的第一个点) 二。拖动鼠标到(或简单地单击)第二个点 二。在第一点和第二点之间画一条线
执行以下操作,在画布上放置一个绿色(或任何其他颜色)圆圈: i、 双击画布,使用右键
由于双击时可能会出错,因此我希望能够选择打印的圆(或线),然后按“删除”按钮删除所选项目。
回到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()
除了delete功能(我还没来得及完成),为什么我的代码没有执行需求1和需求2?
我做错什么了?,更重要的是,如何修复代码以获得所需的功能?
你差不多到了,但是你的逻辑发送代码在双击时画一条线,而不存储双击的位置,所以它需要两次单击来画一条线。另外,您需要在圆代码中绘制画布。下面是一个最低限度的修订版本,它满足了需求1和需求2:
请注意,matplotlib可能不是实现这些要求的最佳或最简单的方法,而且axis将在绘制第一行时自动重新调整其大小。您可以通过修复
xlim
和ylim
来更改此设置。e、 g.如下:要实现需求3,您必须存储拾取的对象并监听与delete匹配的keypress来删除它。这是一个结合以上所有内容的版本。我尽量坚持你的设计。我将对拾取对象的引用存储在相关轴对象中。如果不想将拾取的对象插入到当前轴中,则可能需要实现自己的数据结构来存储该对象。我已经测试过一点,但是可能有一些点击/按键序列会混淆逻辑。
相关问题 更多 >
编程相关推荐