根据不等式方程填充图像区域
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()
我想在 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()