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

pylab.plot绘制分段定义域函数时错误连接点,该如何解决?

解决pylab.plot绘制分段不连续曲线的连接问题

问题出在你用来绘图的x数组是把两段定义域的数值放在同一个连续数组里,pylab.plot默认会按数组顺序连接所有相邻点,自然就把左边段的终点(x=-1)和右边段的起点(x=1)连起来了——这和绘图方法无关,是数据组织的问题。

给你两个简单的解决办法:

  • 分开绘制两段曲线
    分别生成左边定义域和右边定义域的x数组,计算对应y值后,调用两次pylab.plot()分别绘制左右两段:

    import pylab
    import numpy as np
    
    # 生成左右两段的x数据
    x_left = np.linspace(-5, -1, 100)
    x_right = np.linspace(1, 5, 100)
    
    # 计算对应y值
    y_left = x_left * np.sqrt(x_left**2 - 1) / (x_left**2 + 1)
    y_right = x_right * np.sqrt(x_right**2 - 1) / (x_right**2 + 1)
    
    # 分别绘制两段
    pylab.plot(x_left, y_left)
    pylab.plot(x_right, y_right)
    pylab.show()
    
  • 在两段数据之间插入NaN值
    如果想只用一次plot命令,可以在合并的x数组里,在左右段之间插入一个NaN值——pylab.plot遇到NaN会自动断开曲线:

    import pylab
    import numpy as np
    
    # 生成两段x数据并插入NaN分隔
    x_left = np.linspace(-5, -1, 100)
    x_right = np.linspace(1, 5, 100)
    x = np.concatenate([x_left, [np.nan], x_right])
    
    # 计算y值,NaN对应的y也会是NaN
    y = x * np.sqrt(x**2 - 1) / (x**2 + 1)
    
    # 一次绘制即可自动断开
    pylab.plot(x, y)
    pylab.show()
    

另外补充下:你最初没考虑定义域时,虽然有RuntimeWarning,但numpy计算负数的sqrt会得到NaN,这些NaN对应的点不会被绘制,曲线自然断开,所以当时图形符合预期。修正定义域后你应该是过滤掉了中间的NaN,导致数组里的点变成连续的左右段,才出现了错误连接的情况。

内容的提问来源于stack exchange,提问作者Marc Le Bihan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 15:35:37