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

如何修改现有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:39:03