import matplotlib.pyplot as plt import matplotlib.patches as mpatches import matplotlib.path as mpath # from: https://stackoverflow.com/questions/3320311/fill-outside-of-polygon-mask-array-where-indicies-are-beyond-a-circular-bounda def mask_outside_polygon(poly_verts, ax=None): """ Plots a mask on the specified axis ("ax", defaults to plt.gca()) such that all areas outside of the polygon specified by "poly_verts" are masked. "poly_verts" must be a list of tuples of the verticies in the polygon in counter-clockwise order. Returns the matplotlib.patches.PathPatch instance plotted on the figure. """ if ax is None: ax = plt.gca() # Get current plot limits xlim = ax.get_xlim() ylim = ax.get_ylim() # Verticies of the plot boundaries in clockwise order bound_verts = [(xlim[0], ylim[0]), (xlim[0], ylim[1]), (xlim[1], ylim[1]), (xlim[1], ylim[0]), (xlim[0], ylim[0])] # A series of codes (1 and 2) to tell matplotlib whether to draw a line or # move the "pen" (So that there's no connecting line) bound_codes = [mpath.Path.MOVETO] + (len(bound_verts) - 1) * [mpath.Path.LINETO] poly_codes = [mpath.Path.MOVETO] + (len(poly_verts) - 1) * [mpath.Path.LINETO] # Plot the masking patch path = mpath.Path(bound_verts + poly_verts, bound_codes + poly_codes) patch = mpatches.PathPatch(path, facecolor='white', edgecolor='none') patch = ax.add_patch(patch) # Reset the plot limits to their original extents ax.set_xlim(xlim) ax.set_ylim(ylim) return patch