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

3
我希望您能够使用Python中的matplotlib绘制2D图上的填充区域。隐式区域由以下定义:
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使其正常工作,但我无法做到。正确的方法是什么?
编辑:下面是我所需输出的示例图像: enter image description here 这是一个行星在其恒星位置基础上对其环投射阴影的图像。我在Mathematica中创建了该图像,现在我需要在Python中创建相当的内容。我已经有了行星和环的绘图,现在我正在尝试添加阴影。
阴影由两个不等式定义,并驻留在XY平面中。我给出的方程只是为了方便而高度简化;我不需要数学上的帮助,只需要在绘图中实现它。
在Python版本中,我还希望阴影是一个驻留在XY平面中的填充区域。

你有期望输出的示例吗? - Kefeng91
@Kefeng91,我已经添加了一张图片,展示我想要实现的内容。 - ahle6481
1个回答

4

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

要绘制这个图表,您可以使用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()

enter image description here

您可以同样使用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()

很遗憾,我无法让它正常工作。它可以作为独立的图形生成正确的阴影,但是它不能很好地添加到我的现有3D投影中。我需要阴影在任何视角下都能在3D投影中得到正确的呈现。 - ahle6481
我目前无法想象2D阴影在3D中会是什么样子,但我编辑了问题以包括轮廓解决方案。轮廓线也可以在3D图中绘制。 - ImportanceOfBeingErnest
@ahle6481:也许您可以更详细地说明如何从3D模型转换成图像,以及这与Matplotlib有什么关系,或者如何使用Python构建3D模型?... 但是对我来说,这似乎是另一个问题,因此是另一个问题... - xdze2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接