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()
我一直在尝试使用等值线图求解隐式方程,但我意识到它考虑到了方程的奇异性,所以我得到了错误的图表。因此,我尝试了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()