matplotlib存储和删除艺术家

时间:2018-11-17 11:46:38

标签: python matplotlib

我遇到了matplotlib艺术家一个奇怪的问题。

免责声明:不幸的是,我只在jupyter笔记本电脑和tkinter GUI中使用过matplotlib(后者是我找到的地方),因此我不知道如何编写简单的代码来复制问题。但是我不认为示例在这种情况下绝对不需要代码。

现在是问题:

为了加快在GUI中的绘图速度,我不会在绘图元素发生变化时重新绘制所有内容,而是使用set_ydatacanvas.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()

这不会从图中删除线(即使添加了del lineline = None)。

似乎将艺术家存储在列表中,然后将该变量分配给新的空列表,与重新分配直接存储艺术家的变量甚至删除它相比,以某种方式可以更彻底地删除。有人知道这里发生了什么吗?如果仅将其存储为line而不是列表中的行,该如何删除?

1 个答案:

答案 0 :(得分:3)

从下面的代码中可以看出,删除一行非常容易。实际上,您只需在有问题的对象上调用.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()
相关问题