首页 > 解决方案 > matplotlib 存储和删除艺术家

问题描述

我遇到了一个关于 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 lineline = None添加)。

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

标签: pythonmatplotlib

解决方案


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

推荐阅读