Python matplotlib存储和删除艺术家
我在matplotlib艺术家身上遇到了一个奇怪的问题 免责声明:不幸的是,我只在jupyter笔记本和tkinter GUI中使用过matplotlib(我在tkinter GUI中发现了这个),所以我不知道如何编写简单的代码来复制这个问题。然而,我不认为示例代码在这种情况下是绝对需要的 现在问题是: 为了加快GUI中的绘图速度,我不会在绘图元素发生变化时重新绘制所有内容,而是使用Python matplotlib存储和删除艺术家,python,matplotlib,Python,Matplotlib,我在matplotlib艺术家身上遇到了一个奇怪的问题 免责声明:不幸的是,我只在jupyter笔记本和tkinter GUI中使用过matplotlib(我在tkinter GUI中发现了这个),所以我不知道如何编写简单的代码来复制这个问题。然而,我不认为示例代码在这种情况下是绝对需要的 现在问题是: 为了加快GUI中的绘图速度,我不会在绘图元素发生变化时重新绘制所有内容,而是使用set\u ydata和canvas.draw等方法。有时还需要完全删除行,这可以通过artist.remove完
set\u ydata
和canvas.draw
等方法。有时还需要完全删除行,这可以通过artist.remove
完成。问题是:当我在列表中存储了一个或多个艺术家时,我可以通过迭代列表并调用remove
成功地将他们从绘图中删除。但是,如果我直接存储引用(作为管理绘图的类的属性),则调用remove
不会做任何事情
作为代码的草图,假设我们有
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot()
第一个案例是由以下内容生成的
artist_list = list()
for x in range(5):
line = ax.axhline(x)
artist_list.append(line)
并且可以通过
for line in artist_list:
line.remove()
artist_list = list()
(这需要最后一个才能起作用)
而第二个是
line = ax.axhline(1)
line.remove()
不会从绘图中删除线(即使添加了delline
或line=None
)
似乎将艺术家存储在一个列表中,然后将该变量分配给一个新的空列表,比直接重新分配存储艺术家的变量甚至删除它更彻底。有人知道这是怎么回事吗?如果一行只是存储为
line
而不是存储在列表中,那么如何删除该行呢?从下面的代码段可以看出,删除一行非常容易。实际上,您只需对相关对象调用.remove()
,然后重新绘制画布
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.set(title="Click to remove line", xlim=(0,2))
line=ax.axvline(1)
def remove_line(event):
line.remove()
fig.canvas.draw()
fig.canvas.mpl_connect("button_press_event", remove_line)
plt.show()
谢谢你的回答,但当我试图解释这实际上不起作用(至少在我描述的上下文中是这样)。正如我在这个答案中所展示的,它确实起作用。也许你的代码不完整?如果您能在出现此问题的地方向我提供一段可运行的代码,我可以帮助您找出问题所在。