根据不等式方程填充图像区域

Fill a region of an image based on inequality equations

我想在 python 中使用 matplotlib 在二维图上绘制一个填充区域。隐式区域由

定义
def f(x,y):
    return sqrt(2*x*y)-x-y

我想在现有图像中添加由两个不等式定义的 XY 平面中的填充区域,

sqrt(x**2+y**2)-2<=f(x,y) && f(x,y)>=1

为了清楚起见,我想绘制一个由满足上述不等式的所有 (x,y) 值定义的区域。我试过让它与 pyplot.contour 一起工作,但我无法让它工作。正确的做法是什么?

编辑:下面是我想要的输出的示例图像:

这是一张行星根据其与恒星的定位在其光环上投射阴影的图像。我在 Mathematica 中创建了该图像,现在我需要在 python 中创建等效的东西。我已经有了行星和环的图,我正在尝试添加阴影。

阴影由两个不等式定义,位于 XY 平面内。为方便起见,我在上面给出的等式已高度简化;我不需要数学方面的帮助,只需要在情节中实现它。

在 python 版本中,我还希望阴影是位于 XY 平面中的填充区域。

直接使用等高线图会有问题,因为函数只在四个象限中的两个象限中定义。因此,建议首先将不等式转换为网格上的二进制数组。

要绘制此图,您可以使用 imshow 图。

import numpy as np
import matplotlib.pyplot as plt

f = lambda x,y : np.sqrt(2*x*y)-x-y
g = lambda x,y : np.sqrt(x**2+y**2)-2

d = np.linspace(-2,2,2000)
x,y = np.meshgrid(d,d)

im = plt.imshow( ((g(x,y)<=f(x,y)) & (f(x,y)<=1)).astype(int) , 
                extent=(x.min(),x.max(),y.min(),y.max()),origin="lower", cmap="Greys")

plt.show()

您同样可以使用 contourf 图;在这里,为了使轮廓接近二进制值,使用接近 1 的两个级别可能是有意义的。它还需要定义全黑颜色图。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors

f = lambda x,y : np.sqrt(2*x*y)-x-y
g = lambda x,y : np.sqrt(x**2+y**2)-2

d = np.linspace(-2,2,2000)
x,y = np.meshgrid(d,d)
z = ((g(x,y)<=f(x,y)) & (f(x,y)<=1)).astype(int) 

cmap = matplotlib.colors.ListedColormap(["k","k"])
plt.contourf(x,y,z, [0.99999, 1.00001], cmap=cmap)

plt.show()