如何在Matplotlib绘制y=1/x图像时去除渐近线?
解决Matplotlib绘制y=1/x时的虚假渐近线问题
当你用np.linspace(-5,5,1000)生成x值时,图像里出现的“渐近线”其实是Matplotlib把x趋近于0负方向的点和x趋近于0正方向的点直接连起来了——毕竟这两个点对应的y值一个趋向负无穷、一个趋向正无穷,连线就会穿过整个画布,看起来像渐近线。
解决这个问题有两种简单的思路:
方法1:拆分x轴区间分别绘图
把x轴分成两部分:小于0的区域(避开0附近)和大于0的区域(避开0附近),分别计算y值后再绘图,这样就不会出现跨0的错误连线。
示例代码:
import numpy as np import matplotlib.pyplot as plt # 拆分x区间,避开0附近的小范围 x_neg = np.linspace(-5, -0.01, 500) # 左半部分:-5到-0.01,500个点 x_pos = np.linspace(0.01, 5, 500) # 右半部分:0.01到5,500个点 y_neg = 1 / x_neg y_pos = 1 / x_pos plt.figure(figsize=(8, 6)) plt.plot(x_neg, y_neg, 'b-', label='y=1/x') plt.plot(x_pos, y_pos, 'b-') # 用同一种样式,看起来是连续的曲线 plt.axvline(x=0, color='r', linestyle='--', label='x=0(渐近线)') # 手动画真正的渐近线 plt.ylim(-10, 10) # 限制y轴范围,避免极端值撑大画布 plt.xlabel('x') plt.ylabel('y') plt.title('y=1/x 的图像') plt.legend() plt.grid(True) plt.show()
方法2:过滤掉0附近的点
用布尔掩码过滤掉x绝对值小于某个极小值(比如0.01)的点,只保留远离0的x值来绘图。
示例代码:
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-5, 5, 1000) # 过滤掉x绝对值小于0.01的点,避免接近0的极端y值 mask = np.abs(x) > 0.01 x_filtered = x[mask] y_filtered = 1 / x_filtered plt.figure(figsize=(8, 6)) plt.plot(x_filtered, y_filtered, 'b-', label='y=1/x') plt.axvline(x=0, color='r', linestyle='--', label='x=0(渐近线)') plt.ylim(-10, 10) plt.xlabel('x') plt.ylabel('y') plt.title('y=1/x 的图像') plt.legend() plt.grid(True) plt.show()
注意事项
- 为什么不用
x != 0过滤?因为np.linspace(-5,5,1000)生成的点大概率不会刚好等于0,但会有非常接近0的点(比如0.005左右),这些点的y值会非常大,依然会导致连线异常,所以需要设置一个极小的阈值(比如0.01)来避开0附近的区域。 - 手动添加
plt.axvline(x=0)可以画出真正的渐近线,让图像更清晰。
内容的提问来源于stack exchange,提问作者changsoo Lee
相关产品推荐
相关产品推荐

