Matplotlib从图中移除补丁

bksxznpy  于 2023-04-21  发布在  其他
关注(0)|答案(4)|浏览(134)

在我的例子中,我想在点击重置按钮时删除一个圆圈。但是,ax.clear()会清除当前图形上的所有圆圈。
有人能告诉我如何只删除部分补丁吗?

import matplotlib.patches as patches
import matplotlib.pyplot as plt
from matplotlib.widgets import Button

fig = plt.figure()
ax = fig.add_subplot(111) 

circle1 = patches.Circle((0.3, 0.3), 0.03, fc='r', alpha=0.5)
circle2 = patches.Circle((0.4, 0.3), 0.03, fc='r', alpha=0.5)
button = Button(plt.axes([0.8, 0.025, 0.1, 0.04]), 'Reset', color='g', hovercolor='0.975')
ax.add_patch(circle1)
ax.add_patch(circle2)

def reset(event):
    '''what to do here'''
    ax.clear()

button.on_clicked(reset)
plt.show()
4urapxun

4urapxun1#

试试这个:

def reset(event):
    circle1.remove()

也许你更喜欢:

def reset(event):
    circle1.set_visible(False)
vngu2lb8

vngu2lb82#

不同的选择是这样的

def reset(event):
    ax.patches = []

它会删除所有的补丁。这个选项在Matplotlib〈3.5.0时是可行的。在Matplotlib 3.5.0时,你会得到错误AttributeError: can't set attribute
在这种情况下,可以使用以下选项

def reset(event):
    ax.patches.pop()
    # Statement below is optional
    fig.canvas.draw()
3pmvbmvn

3pmvbmvn3#

我也尝试了答案1,虽然它在这个上下文中工作,但在我自己的代码中不起作用。起作用的是在将补丁添加到轴后删除补丁对象,而不是原始的补丁对象,如下所示:

circle1 = patches.Circle((0.3, 0.3), 0.03, fc='r', alpha=0.5)
circle2 = patches.Circle((0.4, 0.3), 0.03, fc='r', alpha=0.5)
button = Button(plt.axes([0.8, 0.025, 0.1, 0.04]), 'Reset', color='g', hovercolor='0.975')
c1=ax.add_patch(circle1)
c2=ax.add_patch(circle2)

def reset(event):
    c1.remove()

button.on_clicked(functools.partial(reset,patch=c1))
plt.show()

否则我得到NotImplementedError('无法删除艺术家')错误。

qmb5sa22

qmb5sa224#

这个简单的解决方案似乎有效:

def reset(event):
    ax.patches.clear()

相关问题