You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

解决sympy plot_implicit绘制含垂直渐近线隐函数时的错误连线问题

问题背景

绘制含垂直渐近线的隐函数(如 (y^2 = \frac{x^3}{6 - x}))时,Matplotlib会在渐近线位置生成多余的垂直线条,严重偏离预期图形。使用adaptive=True虽能移除该线条,但会丢失自定义样式,且线条粗细不均、显示扭曲。要求必须保留adaptive=False,且只能使用plot_implicit()函数。

原始代码

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')

解决方案

核心思路是拆分绘图区间,避开渐近线位置,避免跨渐近线的采样点被错误连接:

  1. 定位垂直渐近线:本例中分母为0时(x=6),即渐近线位置。
  2. 设置极小偏移量(\epsilon)(如(1e-3)),将x轴拆分为(-10, 6-ε)和(6+ε, 10)两个子区间。
  3. 在两个子区间分别调用plot_implicit(),保持相同样式参数后合并绘图。

修改后的代码

from matplotlib.colors import ListedColormap
from sympy 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)
eq = Eq(lhs, rhs)

# 定义渐近线位置和偏移量
asymptote_x = 6
epsilon = 1e-3

# 绘制两个区间的图形(暂不显示)
p1 = spb.plot_implicit(
    eq, (x, -10, asymptote_x - epsilon), (y, -5, 5),
    adaptive=False, show=False, rendering_kw={"cmap": cmap}, aspect='equal'
)
p2 = spb.plot_implicit(
    eq, (x, asymptote_x + epsilon, 10), (y, -5, 5),
    adaptive=False, show=False, rendering_kw={"cmap": cmap}, aspect='equal'
)

# 合并图形并显示
p1.extend(p2)
p1.show()

此方法既保留了adaptive=False的均匀采样样式,又消除了渐近线处的错误连线,同时维持了自定义的颜色配置。

内容的提问来源于stack exchange,提问作者Joshua Guevara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:43:13