我想在Python中绘制一个分段函数,其中有两个变量x
和y
。这意味着我需要某种轮廓图。在Matlab中,可以使用
syms x y
eq1 = 0.1*(x/2)^2-0.3*(y/4)^2;
eq2 = 0.15*(x/3)^2-0.25*(y/2)^2;
ezplot(eq1,[-5 5 -10 10]);
hold on
ezplot(eq2,[-4 4 -5 5]);
其中ezplot
在eq1 = 0
和xmin < x < xmax
上绘制ymin < y < ymax
。 Python中是否有任何(简单)等效函数?
我已经查看了this post中的解决方案。他们的问题仅涉及一个变量x
,因此对我而言无济于事。
答案 0 :(得分:0)
您可以使用masked array
的{{1}}来分隔不同的作品。
首先,为轮廓图定义函数,x和y范围及其2D版本:
import numpy as np
import matplotlib.pyplot as plt
from numpy.ma import masked_array as marr
def eq1(x, y):
return 0.1*(x/2)**2-0.3*(y/4)**2
def eq2(x, y):
return 0.15*(x/3)**2-0.25*(y/2)**2
x = np.linspace(-5, 5, 101)
y = np.linspace(-10, 10, 201)
xx, yy = np.meshgrid(x, y)
现在我们需要一个2D遮罩(或一些遮罩,具体取决于分段函数的数量)来分隔函数不同部分的定义范围:
maskx = ((xx>=-4) * (xx<=4))
masky = ((yy>=-5) * (yy<=5))
mask = maskx * masky
这可以应用于不同的掩码数组:
res1 = marr(eq1(xx, yy), mask)
res2 = marr(eq2(xx, yy), ~mask)
绘制被遮罩的数组会将蒙版为True的所有区域留空:
fig, axs = plt.subplots(1, 2, sharey=True)
axs[0].contour(xx, yy, res1)
axs[0].contour(xx, yy, res2)
axs[0].set_title('contour')
axs[1].contourf(xx, yy, res1)
axs[1].contourf(xx, yy, res2)
axs[1].set_title('contourf')