仅清除 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 图形的一部分的主要内容,如果未能解决你的问题,请参考以下文章