在Python中绘制分段轮廓图

时间:2019-02-26 10:05:53

标签: python matlab matplotlib plot contour

我想在Python中绘制一个分段函数,其中有两个变量xy。这意味着我需要某种轮廓图。在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]);

其中ezploteq1 = 0xmin < x < xmax上绘制ymin < y < ymax。 Python中是否有任何(简单)等效函数?

我已经查看了this post中的解决方案。他们的问题仅涉及一个变量x,因此对我而言无济于事。

1 个答案:

答案 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')

enter image description here