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

时间:2018-07-17 19:20:50

标签: python matplotlib inequality

我想在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平面中的填充区域。

1 个答案:

答案 0 :(得分:2)

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

要绘制此图,可以使用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

您同样可以使用轮廓线图;在这里,为了使轮廓接近于二进制值,使用接近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()