如何修改现有matplotlib代码绘制带自定义标签的两周期tan(x)图像
matplotlib绘制正切函数双周期图像与标记点对齐方案
原有代码核心问题
- 正切函数
tan(x)的周期为π,在kπ + π/2(k为整数)处为奇点,函数值趋近于无穷,原有代码使用直接跨越奇点的连续x数组绘图,会产生连接渐近线的无意义竖线 - 奇点处的tan值为无穷大,原有代码对所有points点绘制标记时,奇点位置的标记无法正常渲染,非奇点位置的标记也会因为y轴范围被奇点值拉伸导致显示异常
修改后完整代码
import matplotlib.pyplot as plt import numpy as np fn = np.tan # 按奇点拆分x区间,避免跨奇点产生错误连线 x_segments = [ np.linspace(-2*np.pi, -3*np.pi/2, 250, endpoint=False), np.linspace(-3*np.pi/2, -np.pi/2, 250, endpoint=False), np.linspace(-np.pi/2, np.pi/2, 250, endpoint=False), np.linspace(np.pi/2, 3*np.pi/2, 250, endpoint=False), np.linspace(3*np.pi/2, 2*np.pi, 250, endpoint=False) ] points = [i * np.pi/2 for i in range(-4, 5)] labels = ["-2π", "-3π/2", "-π", "-π/2", "0", "π/2", "π", "3π/2", "2π"] # 过滤出tan值为有限值的有效标记点 valid_mark_points = [pt for pt in points if not np.isclose(np.abs(fn(pt)), np.inf)] fig, ax = plt.subplots() # 逐段绘制函数曲线 for x in x_segments: ax.plot(x, fn(x), c='#1f77b4') ax.set_xticks(points) ax.set_xticklabels(labels) # 仅绘制有效标记点,保证和函数点完全对齐 for pt in valid_mark_points: ax.plot(pt, fn(pt), "ok") # 绘制坐标轴 ax.hlines(0, -2*np.pi, 2*np.pi, "k") ax.vlines(0, -4, 4, "k") # 可选:灰色虚线绘制奇点位置的渐近线,更符合常规展示效果 for pt in points[1::2]: ax.vlines(pt, -4, 4, linestyles='dashed', colors='gray', alpha=0.5) # 限制y轴显示范围,避免无穷大值拉伸视图 ax.set_ylim(-4, 4) plt.show()
关键调整说明
- x轴数组分段生成:所有区间都避开奇点,不会出现跨渐近线的错误连线
- 过滤无效标记点:仅保留tan值有限的点(-2π、-π、0、π、2π)绘制标记,完全和函数上的对应点对齐
- 固定y轴范围:将y轴限制在(-4,4)区间,函数主体显示清晰,不会被无穷大值拉伸
- 如果仅需要显示2个完整正切周期,可将x范围调整为
-π到π,仅保留(-π, -π/2)、(-π/2, π/2)、(π/2, π)三个分段即可
内容的提问来源于stack exchange,提问作者Gabriela
相关产品推荐
相关产品推荐

