简介
在本实验中,你将学习如何使用 Matplotlib 创建具有离散值的滑块。你将学习如何将滑块的值限制在一组允许的值范围内,并将滑块值捕捉到这些允许的值上。
虚拟机提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,请随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。
导入所需库
在这一步中,你将导入本实验所需的库。你将使用 Matplotlib 来创建滑块,并使用 NumPy 来生成要绘制的数据。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.widgets import Button, Slider
生成数据
在这一步中,你将生成要绘制的数据。你将创建一个频率为 3Hz、振幅为 5 的正弦波。
t = np.arange(0.0, 1.0, 0.001)
a0 = 5
f0 = 3
s = a0 * np.sin(2 * np.pi * f0 * t)
创建图形和坐标轴
在这一步中,你将为绘图创建图形和坐标轴。你还将调整坐标轴的位置,以便为滑块留出空间。
fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.25)
l, = ax.plot(t, s, lw=2)
ax_freq = fig.add_axes([0.25, 0.1, 0.65, 0.03])
ax_amp = fig.add_axes([0.25, 0.15, 0.65, 0.03])
定义振幅滑块的允许值
在这一步中,你将定义振幅滑块的允许值。振幅滑块将使用这些值来捕捉到最接近的允许值。
## define the values to use for snapping
allowed_amplitudes = np.concatenate([np.linspace(.1, 5, 100), [6, 7, 8, 9]])
创建滑块
在这一步中,你将创建滑块。你将为振幅创建一个滑块,为频率创建一个滑块。
samp = Slider(
ax_amp, "Amp", 0.1, 9.0,
valinit=a0, valstep=allowed_amplitudes,
color="green"
)
sfreq = Slider(
ax_freq, "Freq", 0, 10*np.pi,
valinit=2*np.pi, valstep=np.pi,
initcolor='none' ## Remove the line marking the valinit position.
)
创建更新函数
在这一步中,你将为滑块创建更新函数。当滑块值发生变化时,此函数将更新绘图。
def update(val):
amp = samp.val
freq = sfreq.val
l.set_ydata(amp*np.sin(2*np.pi*freq*t))
fig.canvas.draw_idle()
将滑块与更新函数连接
在这一步中,你将把滑块与更新函数连接起来。这将确保每当滑块值发生变化时,绘图都会更新。
sfreq.on_changed(update)
samp.on_changed(update)
创建重置按钮
在这一步中,你将为滑块创建一个重置按钮。点击时,重置按钮会将滑块值重置为其初始值。
ax_reset = fig.add_axes([0.8, 0.025, 0.1, 0.04])
button = Button(ax_reset, 'Reset', hovercolor='0.975')
def reset(event):
sfreq.reset()
samp.reset()
button.on_clicked(reset)
显示绘图
在这一步中,你将显示绘图。
plt.show()
总结
在这个实验中,你学习了如何使用 Matplotlib 创建具有离散值的滑块。你学习了如何将滑块的值限制在一组允许的值范围内,并将滑块值捕捉到这些允许的值上。你还学习了如何为滑块创建一个重置按钮。