python - 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 line
或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()
推荐阅读
- php - 如何使用 POST 在 URL 上读取由第 3 方传递的 XML 消息?
- wpf - WPF 不需要的样式继承
- python - 在 pipenv 上安装 Weasyprint 所需的库(Windows 环境)
- java - 如何在两个时间戳之间存在的 java fx 8 表视图中显示数据
- vue.js - 在 Vue.js 中找不到图像路径
- maven - Nexus 3 存储库:升级后旧路径不起作用
- java - 在 FirebaseAuth android 中添加额外的个人资料信息
- resources - 找不到元素“资源”的声明
- reactjs - 在单个请求中发送 Multipart 文件和 @RequestBody
- javascript - 使用 ajax 更新 div