我一直试图用等高线图来求解一个隐式方程,但我意识到它考虑到了我的方程的奇异性,所以我得到了错误的图。正因为如此,我尝试了sympy.plot_implicit。幸运的是,它工作正常,但我还没有找到在sympy.plot_implicit生成的图形上设置标签的适当方法。为此目的,我需要获得sympy.plot_implicit用于生成其图形的点,并将它们用于matplotlib。这样,我得到了我的隐式方程的正确解,并且我可以很容易地为解的图设置标签。此时,当我试图从sympy.plot_implicit获得观点时,我面临着许多问题,我的意思是,当我只使用sympy.plot时,没有任何问题,但是当我使用sympy.plot_implicit时,问题就出现了。
我已经附上密码了,谢谢。最好的
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()发布于 2021-10-03 18:27:28
您可以使用来自move_sympyplot_to_axes的Display two Sympy plots as two Matplotlib subplots函数,如其注释中所解释的那样调整一行。
要在图例中获得某些内容,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()

https://stackoverflow.com/questions/69422485
复制相似问题