python - 从绘图屏幕上单击的两点画线,然后删除艺术家

标签 python python-3.x matplotlib plot event-handling

我希望此代码允许我在绘图屏幕上的两个不同位置单击,在每个单击的坐标上绘制一个“X”,然后在它们之间画一条线。之后,如果我再次单击绘图屏幕,我希望代码删除“X”散点和线条。下面的代码在删除行时遇到问题(用于删除散点)。它不断返回 UnboundLocalError: local variable 'l' referenced before assignment。有人可以向我解释为什么使用这种方法,remove() 方法适用于散点图但不适用于折线图吗?谢谢!

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1,2,3], [10,20,30])
p_arts = []
px, py = [], []

def onclick(event):
    if len(p_arts) < 2:
        p = ax.scatter(event.xdata, event.ydata)
        p_arts.append(p)
        px.append(event.xdata)
        py.append(event.ydata)
        if len(p_arts) == 2:
            l = ax.plot(px, py)
    else:
        p_arts[0].remove()
        p_arts[1].remove()
        p_arts.clear()
        px.clear()
        py.clear()
        l.remove()
    fig.canvas.draw()

cid = fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()

最佳答案

首先,让我们看看错误的含义。

它在 l.remove() 行引发,表示变量 l 已在您的函数中的某处定义,但是在调用 remove 的时间,尚未定义

请注意,l 是一个本地 变量,这意味着它的一个实例在您的函数被调用时创建,并在之后被销毁;它不会在调用之间传递。

那么,很明显,由于l只定义在if分支,如果走else分支,我们会遇到一个错误,因为对于 onclick 的特定调用,l 不存在。

解决方案就是将它附加到 p_arts,就像您为 scatterplot 艺术家所做的那样。我也会稍微清理一下代码,如下所示:

def onclick(event):
    if len(p_arts) == 0:
        # plot first scatter
        scatter_artist = ax.scatter(event.xdata, event.ydata)
        p_arts.append(scatter_artist)

    elif len(p_arts) == 1:
        # plot second scatter and line
        scatter_artist = ax.scatter(event.xdata, event.ydata)
        p_arts.append(scatter_artist)
        line_artist = ax.plot([event.xdata], [event.ydata])[0]
        p_arts.append(line_artist)

    else:
        # remove everything
        for artist in p_arts:
            artist.remove()

    fig.canvas.draw()

关于python - 从绘图屏幕上单击的两点画线,然后删除艺术家,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56086749/

相关文章:

python - Flask - 在 Google App Engine 中获取请求参数?

python - 如何在 matplotlib 绘图中删除 LaTeX 风格数学中的奇怪空间

Python itertools groupby 在列表理解中的多次使用

python - 在 Python 3.6.10 上运行异步 Flask 2.0.0 时出错

python - Python中的此Unbound Local错误是什么意思?

python - 使用特定方法对嵌套的对象列表进行排序

python - 如何在matplotlib barh图中删除空的 "padding"?

python - 删除 matplotlib 中 x 轴共享图中的冗余代码

python - 使用 python 在 docker 上设置rabbitMQ

python - 通过循环创建二叉树