Python - построить уравнение: x + abs (x) = y + abs (y) - PullRequest
0 голосов
/ 08 апреля 2020

Почему эта программа строит неправильные вещи?
Я имею в виду ... почему отсутствует луч (x=0, y<=0)? Разве это не ошибка?

import matplotlib.pyplot
from numpy import arange
from numpy import meshgrid

delta = 0.025
xrange = arange(-20.0, 20.0, delta)
yrange = arange(-20.0, 20.0, delta)
X, Y = meshgrid(xrange,yrange)

# F is one side of the equation, G is the other
F = Y + abs(Y)
G = X + abs(X)

matplotlib.pyplot.contour(X, Y, (F - G), [0])
matplotlib.pyplot.show()

plot

Правильный график должен быть примерно таким, как показано ниже.
Как мне добиться чего-то подобного в Python?

plot2

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

Чтобы нарисовать неявные уравнения (или неравенства), sympy s plot_implicit может пригодиться. Просто вызывая plot_implicit(Eq(x+Abs(x), y+Abs(y))) dr aws уравнение с некоторыми границами по умолчанию.

К сожалению, построение sympy довольно примитивно в опциях, и стандартные функции matplotlib сложно комбинировать. Кроме того, в части документации все еще говорится о «графике Пиглета», который на самом деле больше не поддерживается.

from sympy import Abs, Eq, plot_implicit
from sympy.abc import x, y

# plot_implicit(Eq(x+Abs(x), y+Abs(y)))
plot_implicit(Eq(x+Abs(x), y+Abs(y)), (x, -20, 20), (y, -20, 20))

resulting plot

Использование некоторых трюков из этот пост , симпатичный сюжет может быть перемещен по осям matplotlib. Там можно изменить поворот метки y и толщину линии (кажется, недостаточно просто изменить ширину, а затем необходимо задать цвет кромки).

from sympy import Abs, Eq, plot_implicit
from sympy.abc import x, y
from matplotlib import pyplot as plt
import matplotlib as mpl

def move_sympyplot_to_axes(p, ax):
    backend = p.backend(p)
    backend.ax = ax
    # backend.process_series()
    backend._process_series(backend.parent._series, ax, backend.parent)
    backend.ax.spines['right'].set_color('none')
    backend.ax.spines['bottom'].set_position('zero')
    backend.ax.spines['top'].set_color('none')
    plt.close(backend.fig)

p1 = plot_implicit(Eq(x+Abs(x), y+Abs(y)), (x, -20, 20), (y, -20, 20), show=False)

fig, ax = plt.subplots()
move_sympyplot_to_axes(p1, ax)
plt.setp(ax.yaxis.get_label(), 'rotation', 0)
ax.get_children()[0].set_linewidth(2)
ax.get_children()[0].set_edgecolor('deepskyblue')

plt.show()

new plot

1 голос
/ 08 апреля 2020

Это может быть чит, но plt.fill_between() может использоваться для заполнения области между двумя строками (см. do c).

import matplotlib.pyplot as plt

q = 50
x = [-q, 0, 0, q]
y1 = [0, 0 , 0, q]
y2 = [-q, -q, 0 , q]

fig, ax = plt.subplots()

ax.plot(x, y1, color='C0')
ax.plot(x, y2, color='C0')
ax.fill_between(x, y1, y2, alpha=0.2, color='C0')

ax.set_xlim(-20,20)
ax.set_ylim(-20,20)
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...