我想在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
配合使用,但无法使其配合使用。正确的方法是什么?
这是行星根据其与恒星的位置在其圆环上投射阴影的图像。我在Mathematica中创建了该图像,现在我需要在python中创建等效的图像。我已经有了行星和环的图,并且我正在尝试添加阴影。
阴影由两个不等式定义,并位于XY平面中。为了方便起见,我上面给出的方程式已高度简化。我不需要数学方面的帮助,只需在图解中实现即可。
在python版本中,我还希望阴影成为位于XY平面中的填充区域。
答案 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()
您同样可以使用轮廓线图;在这里,为了使轮廓接近于二进制值,使用接近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()