I am trying to plot various rectangles on top of an image stream. Before displaying the next image, all former rectangles should be removed again.
From this question I found a first possible solution. Below is a simplified example of what I am doing at the moment.
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]
What I don't like about this is that I have to keep track of of the patch_lst
in order to remove them again. I would prefer to simply remove all patches and get something like this:
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
I did try ax.clear()
, however this also removes the underlying image. Any suggestions?
One possible way is to get a list of the patches using ax.patches
. Therefore, you can use the existing list comprehension that you use to remove the patches using your list, but instead replace the list with 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)]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With