Matplotlib从图中删除所有补丁

时间:2018-04-12 08:41:31

标签: python matplotlib

我试图在图像流的顶部绘制各种矩形。在显示下一个图像之前,应再次删除所有以前的矩形。

this question我找到了第一个可能的解决方案。以下是我目前正在做的事情的简化示例。

fig, ax = plt.subplots(1)
im = ax.imshow(np.zeros((800, 800, 3)))

for i in range(100):
    img = plt.imread('my_image_%03d.png' % i)
    im.set_data(img)

    rect_lst = getListOfRandomRects(n='random', dim=img.shape[0:2])
    patch_lst = [patches.Rectangle((r[0], r[1]), r[2], r[3],
                                   linewidth=1, facecolor='none')
                 for r in rect_lst]
    [ax.add_patch(p) for p in patch_lst]
    plt.pause(0.1)
    plt.draw()
    [p.remove() for p in patch_lst]

我不喜欢这件事是我必须跟踪patch_lst以便再次删除它们。我宁愿简单地删除所有补丁并得到这样的东西:

for i in range(100):
    [...]

    rect_lst = getListOfRandomRects(n='random', dim=img.shape[0:2])
    [ax.add_patch(patches.Rectangle((r[0], r[1]), r[2], r[3],
                                    linewidth=1, facecolor='none'))
                 for r in rect_lst]

    plt.pause(0.1)
    plt.draw()
    ax.clear_all_patches()       # <-- this is what I am looking for

我确实尝试了ax.clear(),但这也删除了基础图像。有什么建议吗?

1 个答案:

答案 0 :(得分:3)

一种可能的方法是使用ax.patches()获取补丁列表。因此,您可以使用现有的列表推导来使用列表删除修补程序,而是将列表替换为for i in range(100): [...] rect_lst = getListOfRandomRects(n='random', dim=img.shape[0:2]) [ax.add_patch(patches.Rectangle((r[0], r[1]), r[2], r[3], linewidth=1, facecolor='none')) for r in rect_lst] plt.pause(0.1) plt.draw() [p.remove() for p in reversed(ax.patches)]

connectFauxDOM