仅清除 matplotlib 图形的一部分

Posted

技术标签:

【中文标题】仅清除 matplotlib 图形的一部分【英文标题】:Clear only part of matplotlib figure 【发布时间】:2012-12-01 16:36:39 【问题描述】:

我正在使用嵌入在 WxPython GUI 中的 matplotlib 图来呈现一些数据。 图形的内容(显示的数据)随着单击按钮的功能不断变化,...

数据有两种类型。

1) 等高线

self.axes.contour(x_scale_map,y_scale_map,matrix,cl,cmap=my_cmap,extent=0,matrix.shape[1]-1,0,matrix.shape[0]-1))

加载速度相对较慢(约 1 秒),但不会经常更改。

2) 在这个轮廓的顶部,我绘制了一些线条

self.axes.axhline(y,color='black')

这些线条显然是立即绘制的,并且经常随着用户点击的功能而变化。在这些情况下,之前绘制的线条需要消失,新的线条需要出现,而等高线图保持不变。

现在,我的问题如下。我还没有找到只删除线条而不是轮廓的方法。获得所需结果的唯一方法似乎是:

self.axes.clear()

然后重新绘制轮廓和新线。但如前所述,每次重新加载轮廓都很慢,因此很烦人。

有没有办法只清除图中的线条? 我试图通过执行以下操作来使用叠加的子图:

self.axes1 = self.fig.add_subplot(111)
self.axes2 = self.fig.add_subplot(111)
self.axes1.contour(...)
self.axes2.axhline(y,color='black')
self.axes2.clear()

但最后一行清除了整个图形。

有谁知道如何实现所需的功能? 谢谢

【问题讨论】:

您可以将线条变为不可见并重新绘制轴。 (对于任何 matplotlib 艺术家,您都可以这样做 artist.set_visible(False)。)此外,如果您正在做一些事情,您可以更新现有行的数据,而不是添加新行并隐藏旧行,您应该只更新旧行.有很多隐藏的艺术家最终会开始减慢情节的渲染速度。 嗨@JoeKington,我没想过以您提出的方式解决问题。我一直在这个方向上进行更多搜索,还发现了以下Q&A。换句话说,我设法使用artist.set_visible(True/False)artist.remove() 以及del artist 的组合获得了我想要的一切。谢谢 @tcaswell -- 完成,谢谢 【参考方案1】:

下面Q&A给出了这个问题的解决方案。

换句话说,要能够从图中删除一条线:

1) 通过在绘制时存储其引用来跟踪线条:

my_line = self.axes.axhline(y,color='black')

2) 然后按如下方式进行移除:

my_line.remove()
del my_line

【讨论】:

【参考方案2】:

通过使用 self.axes2.cla() 的等效项来清除指定的轴,我成功解决了此类问题。在我的情况下,我必须使用 sharex 和 sharey 以及 self.axes2.patch.set_aplha(0.0) 来使 facecolor 透明并看透下面的图。

我现在的问题是我在 axes1 图上定义了一个选择器,但它似乎不会在存在上层图的情况下触发。

【讨论】:

以上是关于仅清除 matplotlib 图形的一部分的主要内容,如果未能解决你的问题,请参考以下文章

一行Python代码有多强,可让图形秒变「手绘风」

R python在无图形用户界面时保存图片

matplot绘图

Matplotlib 和 PyQt5 绘图图

在 PyQt4 的嵌入式 matplotlib 图中使用 ginput

使用 seaborn/matplotlib 创建具有轴限制的图形 [重复]