Построение кусочно-контурного графа в Python - PullRequest
0 голосов
/ 26 февраля 2019

Я хочу построить кусочную функцию в 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?

Я смотрел на решения в этом посте .Их проблема связана только с одной переменной x, поэтому в моем случае это бесполезно.

1 Ответ

0 голосов
/ 26 февраля 2019

Вы можете разделить различные части, используя numpy masked array.
Сначала определите ваши функции, диапазоны 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)

Теперь нам нужна двумерная маска (или несколько, в зависимости от количества частей кусочной функции), чтобы разделить диапазоны определения различных частей функции:

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

...