Question: Using matplotlib and python, I have a grey-scale image of labeled objects, on which I want to draw a homogeneously coloured overlay image with a position and shape based on a changeable input parameter - an object identifier. Basically an outline and enhancement of on of the objects in the image. I can generate the overlay, and re-generate it correctly (I think) every time the input value changes. But I don't know how to clear the previous overlay before drawing the new one. So, in the end, the grey-scale image is overlaid with multiple overlays. This is what I have tried, and it doesn't work. 'overlay',and 'object_data' are defined and used in the calling function:  def overlay_object(object_num): try: overlay except NameError: # nothing pass else: # remove old overlay for handle in overlay: handle.remove() # color the selected object componentMask = (object_data == object_num) masked = ma.masked_where(componentMask == 0, componentMask) overlay = ax.imshow(masked, 'jet', interpolation='none', alpha=0.5) return overlay  Edit: This is the creation of the grey-scale image in the main program: fig, ax = plt.subplots() ax.imshow(object_data, cmap='gray') ax.axis('off') 

Answer: If you’re trying to update overlay on a grayscale without accumulating overlays, you should use this approach: import matplotlib.pyplot as plt import numpy as np import numpy.ma as ma def create_interactive_overlay(object_data): """ Creates a figure with a grayscale base image and functions to update overlays. Parameters: object_data : numpy.ndarray The labeled image data where each object has a unique integer value Returns: fig : matplotlib.figure.Figure The figure object update_overlay : function Function to call to update the overlay """ # Create the figure and base image fig, ax = plt.subplots() ax.imshow(object_data, cmap='gray') ax.axis('off') # Initialize overlay as None overlay_artist = [None] # Use list to allow modification in nested function def update_overlay(object_num): """ Updates the overlay to highlight a specific object number. Parameters: object_num : int The object identifier to highlight """ # Remove existing overlay if it exists if overlay_artist[0] is not None: overlay_artist[0].remove() # Create mask for selected object component_mask = (object_data == object_num) masked = ma.masked_where(component_mask == 0, component_mask) # Create new overlay overlay_artist[0] = ax.imshow(masked, cmap='jet', interpolation='none', alpha=0.5) # Redraw the figure fig.canvas.draw_idle() return fig, update_overlay # Example usage: """ # Create sample data object_data = np.zeros((100, 100)) object_data[20:40, 20:40] = 1 object_data[60:80, 60:80] = 2 # Create interactive figure fig, update_overlay = create_interactive_overlay(object_data) # Update overlay for different objects update_overlay(1) # Highlight object 1 plt.pause(1) # Pause to see the change update_overlay(2) # Highlight object 2 plt.show() """  In the above solution, the overlay management is handled by:  Keeping track of the overlay artist using a list (to allow modification in the nested function) Properly removing the previous overlay before creating a new one Using draw_idle() to update the figure  The code is structured to separate the setup from the update functionality:  create_interactive_overlay handles the initial setup update_overlay handles the dynamic updates  To use this in your code, you would do something like this: fig, update_overlay = create_interactive_overlay(object_data) # When you want to highlight a different object: update_overlay(new_object_number)  Hope this helps