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

如何编写a*sinx的更新函数(a为滑块控制的振幅,matplotlib动态绘图)

问题排查
  • X轴数据不符合要求:你用随机函数生成了10个离散整数值作为x坐标,不仅大量值超出你设置的x轴显示范围[-π-2, π+2],离散的随机点也不可能拼接出连续的正弦曲线。
  • 正弦计算逻辑前后不一致:初始生成y值时使用了np.sin(2*np.pi*x_values[i]),但更新函数里计算y值时没有乘2π,两边规则不匹配。
  • 滑块初始值不合理:你把滑块初始值设为0,启动后曲线初始y值全部为0,看不到基础正弦形态。
  • Y轴范围设置不合理:原代码Y轴范围是-10到10,但是滑块最大振幅为30,振幅超过10的部分会无法显示。
修正后可运行代码
import matplotlib
import numpy as np
import tkinter as tk
from matplotlib.widgets import Slider
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
matplotlib.use('TkAgg')

root = tk.Tk()
root.wm_title("Sine graph")
fig = plt.Figure()
canvas = FigureCanvasTkAgg(fig, root)
canvas.get_tk_widget().pack(fill=tk.BOTH, expand=1)
ax = fig.add_subplot(111)
fig.subplots_adjust(bottom=0.25)

# 生成连续的x轴采样点,覆盖显示范围
x_values = np.linspace(-np.pi, np.pi, 1000)
# 统一正弦计算逻辑,初始振幅为1
y_values = np.sin(x_values)
# 调整y轴范围适配滑块最大振幅
ax.axis([(-np.pi-2), (np.pi+2), -30, 30])

ax_value = fig.add_axes([0.12, 0.1, 0.78, 0.03])
# 滑块初始值设为1
s_time = Slider(ax_value, '振幅', 0, 30, valinit=1)
(l,) = ax.plot(x_values, y_values)

def update(val):
    pos = s_time.val
    l.set_ydata(pos * np.sin(l.get_xdata()))
    fig.canvas.draw_idle()

s_time.on_changed(update)
tk.mainloop()
修改说明
  • 把随机离散的x值替换为np.linspace生成的1000个连续均匀采样点,完全覆盖x轴显示范围,保证曲线平滑。
  • 统一了初始和更新阶段的正弦计算逻辑,去掉了冗余的2π系数(如果需要调整正弦周期,可自行在sin参数中添加对应系数)。
  • 滑块初始值调整为1,启动即可看到振幅为1的标准正弦曲线,拖动滑块即可实时调整振幅。
  • 同步把y轴范围调整为-30到30,适配滑块最大振幅30的显示需求。

内容的提问来源于stack exchange,提问作者sillydoubts

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:57:05