Значения NaN в z
не отображаются. Следовательно, все, что вам нужно сделать, это определить путь клипа, а затем определить, какие значения (x, y) выходят за пределы этого пути, и установить соответствующие значения z
равными NaN.
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-5, 5, 0.01) # need higher resolution to get nice clipping boundaries
y = np.arange(-5, 5, 0.01)
xx, yy = np.meshgrid(x, y) # need dense meshgrid for contains_points
z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2)
patch = plt.Circle((-2, 2), 1) # circle with radius 1 around the point (-2, 2)
path = patch.get_path().transformed(patch.get_patch_transform()) # the path attribute of Circle has to be transformed to data units
is_valid = path.contains_points(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)
z[~is_valid] = np.nan # NaN values are not plotted
h = plt.contourf(xx,yy,z)
plt.plot(-2, 2.5, 'or')
plt.show()