如何阻止matplotlib在垂直渐近线处错误地添加线条?

f0brbegy  于 2023-04-07  发布在  其他
关注(0)|答案(1)|浏览(141)

对于包含垂直渐近线的函数,y^2 = x^3/(2(3)- x)例如,matplotlib将在渐近线处添加vertical lines,这主要会抛出expected图。()from sympy.我试过将adaptive属性设置为True,这会删除线条,但也会删除样式,并且由于某些原因使得绘图线粗细变化,看起来真的是warped。我想保持adaptive=False。由于特定于我的应用程序的原因,我需要使用plot_implicit(),而不能使用contour()或plot()或其他东西。

from matplotlib.colors import ListedColormap
from sympy import *
from sympy.parsing.sympy_parser import *
import spb

qVal = "y**2 = x**3/(2*(3) - x)"
x, y = symbols('x y')


cmap = ListedColormap(["teal"], "#ffffff00")

lhs,rhs = qVal.split('=')
lhs = eval(lhs)
rhs = eval(rhs)

plot = spb.plot_implicit(Eq(lhs, rhs),  (x, -10, 10), (
y,-5, 5), adaptive=False,show=True, rendering_kw= {"cmap": cmap}, aspect='equal')
i7uaboj4

i7uaboj41#

plot_implici with adaptive=False使用一个简单的meshgrid方法来计算一个函数,它使用matplotlib的contour功能来绘制零级轮廓。“simple”的意思是它不应用任何后处理。你可以看看你的函数的3D图,它也使用meshgrid方法,来理解发生了什么:

expr = lhs - rhs
spb.plot3d(expr, (x, -10, 10), (y,-5, 5), backend=spb.PB, wireframe=True)

由于没有对评估数据进行后处理,因此图中连接了渐近线的两侧。当您采用零水平轮廓时,您将获得该垂直线。遗憾的是,meshgrid方法目前没有实现渐近线检测。
您可以安装newer release of the module以将plot_implicitadaptive=True和自定义样式一起使用:

plot = spb.plot_implicit(Eq(lhs, rhs),  (x, -10, 10), (y,-5, 5), aspect='equal',
                         adaptive=True, rendering_kw={"color": "r"})

正如你所注意到的,自适应算法往往会产生不均匀的线条或区域,我对此无能为力。
更好的方法是对符号方程进行一些后处理。例如:

expr = lhs - rhs
sols = solve(expr, y)
spb.plot(*sols, (x, -10, 10), {"color": "b"},
         legend=False, aspect="equal", ylim=(-5, 5))

相关问题