如何在matplotlib python中定义边界?

时间:2018-12-31 15:03:56

标签: python matplotlib plot

我想绘制以下场方程:

  • dx / dt = x *(4 * y + 3 * x-3)
  • dy / dt = y *(4 * y + 3 * x-4)

但是我不知道如何将边界限制为三角形:x>=0, y>=0, x<=1-y

enter image description here

# stream plot with matplotlib
import numpy as np
import matplotlib.pyplot as plt
def velocity_i(x,y):
    vx = x*(3*x+4*y-3)
    vy = y*(3*x+4*y-4)
    return vx, vy
n=100
x = np.linspace(0, 1, n)
y = np.linspace(0, 1, n)
X, Y = np.meshgrid(x, y)
Ux, Uy = velocity_i(X, Y)
vels = (Ux**2+Uy**2)**0.5
plt.figure(figsize=(5,4))
stream = plt.streamplot(X, Y,
              Ux,Uy,
              arrowsize=1,
              arrowstyle='->',
              color= vels,
              density=1,
              linewidth=1,
                       )
plt.xlabel(r"$\Omega_{\rm m}$",fontsize='14')
plt.ylabel(r"$\Omega_{\rm r}$",fontsize='14')
plt.colorbar(stream.lines)

plt.xlim((-.05,1.05))
plt.ylim((-.05,1.05))
plt.show()

1 个答案:

答案 0 :(得分:4)

使用NumPy遮罩和np.where函数可以很容易地实现这一点。我仅显示完成工作所需的相关两行代码(以注释突出显示)。

说明X<=1-Y检查您所需的边界条件,然后在所有保持该条件True的索引处,分配Ux的实际计算值(或Uy),并在条件为False的索引处分配0。在这里,X<=1-Y充当条件掩码的一种。

Ux, Uy = velocity_i(X, Y)
Ux = np.where(X<=1-Y, Ux, 0) # <--- Boundary condition for Ux
Uy = np.where(X<=1-Y, Uy, 0) # <--- Boundary condition for Uy
vels = (Ux**2+Uy**2)**0.5

enter image description here