如何阻止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')
解决方案
核心思路是拆分绘图区间,避开渐近线位置,避免跨渐近线的采样点被错误连接:
- 定位垂直渐近线:本例中分母为0时(x=6),即渐近线位置。
- 设置极小偏移量(\epsilon)(如(1e-3)),将x轴拆分为
(-10, 6-ε)和(6+ε, 10)两个子区间。 - 在两个子区间分别调用
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
相关产品推荐
相关产品推荐

