get_points 同情 plot_implicit

get_points in sympy plot_implicit

我一直在尝试使用等值线图求解隐式方程,但我意识到它考虑到了方程的奇异性,所以我得到了错误的图表。因此,我尝试了sympy.plot_implicit。幸运的是,它工作正常,但我还没有找到在 sympy.plot_implicit 生成的图形上设置标签的正确方法。为此,我需要获取 sympy.plot_implicit 用于生成其图形的点并将它们用于 matplotlib。这样,我就获得了隐式方程的正确解,并且可以轻松地为解的图形设置标签。目前,当我尝试从 sympy.plot_implicit 获取点时遇到很多问题,我的意思是,当我只使用 sympy.plot 时没有任何问题,但是当我使用 [=14] 时出现问题=].
我附上了代码,提前谢谢你。 最佳

import matplotlib.pyplot as plt
import sympy as sp
from sympy.abc import x,y,z

def z(x, y):
    return x - y

line = sp.plot(x**2,(x,-1,0), show=False)

#line = sp.plot_implicit(z(x, y), (x, 0, 1), (y, 0, 1), show=False)

x, y = line[0].get_points()

plt.plot(x, y)

plt.show()

您可以使用 中的 move_sympyplot_to_axes 函数,按照其注释中的说明调整一行。

要在图例中得到一些东西,matplotlib 的标准做法是为特定元素添加标签。在这种情况下,隐式区域似乎存储为 ax.patches 内的多边形。这样的多边形将在图例中显示为彩色矩形。为了获得一条线,可以创建自定义图例元素。

在这种情况下,解决方案表示为细多边形而不是直线 p1[0].get_points() 不起作用。但是,您可以从 matplotlib 多边形补丁中提取多边形的顶点:

import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
import sympy as sp
from sympy.abc import x, y, z

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

def z(x, y):
    return (x ** 2 + y ** 2 - 1) ** 3 - x ** 2 * y ** 3

p1 = sp.plot_implicit(z(x, y), (x, -1.5, 1.5), (y, -1.5, 1.5), show=False)

fig, ax = plt.subplots()

move_sympyplot_to_axes(p1, ax)
# ax.patches[0].set_label("my label")
handles = [Line2D([], [], color=ax.patches[0].get_facecolor())]
ax.legend(handles=handles, labels=["my label"], loc='upper left')

vertices = ax.patches[0].get_path().vertices
ax.plot(vertices[:, 0], vertices[:, 1], ls=':', color='gold', lw=10, alpha=0.5, zorder=0)

plt.show()