我遇到了matplotlib艺术家一个奇怪的问题。
免责声明:不幸的是,我只在jupyter笔记本电脑和tkinter GUI中使用过matplotlib(后者是我找到的地方),因此我不知道如何编写简单的代码来复制问题。但是我不认为示例在这种情况下绝对不需要代码。
现在是问题:
为了加快在GUI中的绘图速度,我不会在绘图元素发生变化时重新绘制所有内容,而是使用set_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()
这不会从图中删除线(即使添加了del line
或line = None
)。
似乎将艺术家存储在列表中,然后将该变量分配给新的空列表,与重新分配直接存储艺术家的变量甚至删除它相比,以某种方式可以更彻底地删除。有人知道这里发生了什么吗?如果仅将其存储为line
而不是列表中的行,该如何删除?
答案 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()