清除 Matplotlib 图形的部分内容

7

我将在一个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) 来实现。)此外,如果你正在进行的操作中可以更新现有线条的数据而不是添加新的并隐藏旧的,则应该更新旧的线条。拥有大量隐藏的图形对象最终会开始减慢绘图的渲染速度。 - Joe Kington
嗨@JoeKington,我没有考虑过你提出的解决问题的方式。我在这个方向上进行了更多的搜索,并找到了以下问答。换句话说,我使用artist.set_visible(True/False)artist.remove()以及del artist的组合成功地获得了我想要的一切。谢谢。 - savantas
2个回答

7
以下问答提供了解决此问题的方法。
换句话说,要能够从图形中删除一条线:
1)在绘制时存储其引用以跟踪该线:
my_line = self.axes.axhline(y,color='black')

2)然后进行如下删除:

my_line.remove()
del my_line

1
我曾经遇到过类似的问题,通过使用相当于self.axes2.cla()的等效方法来清除指定的坐标轴,我成功解决了这个问题。在我的情况下,我必须使用sharex和sharey以及self.axes2.patch.set_aplha(0.0)使面颜色透明并透视到下面的图表。
但是,我的问题现在是,在axes1图表上定义了一个选择器,但在有覆盖图表的情况下似乎不会触发。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接