图形小部件
matplotlib官方教程中给出了一个使用滑块、按钮、单选框的例子。初次阅读时多少有些疑问,这些疑问不仅包括对matplotlib的用法,同时也有代码本身所表达的含义, 以下为对官方代码的理解和整理。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Button, Slider, RadioButtons
# 准备数据
t = np.arange(0.0, 1.0, 0.01) # 时间
a0 = 5 # 振幅
f0 = 3 # 频率
s = a0*np.sin(2*np.pi*f0*t) # 信号
# 绘制信号曲线
fig, ax = plt.subplots() # 创建figure和subplot
l, = plt.plot(t, s, lw=2, color='red') # 在当前axes上绘制曲线
plt.axis([0, -1, -10, 10]) # 设置当前axes的X,Y轴的显示范围
# 颜色
axcolor = 'lightgoldenroyellow'
# 添加频率axes,并在该axes上绘制频率滑块
delta_f = 5.0 # 频率步进值
axfreq = plt.axes([0,25, 0.1, 0.65, 0.04], facecolor=axcolor) # 在当前figure上绘制
sfreq = Slider(axfreq, 'Freq', 0.1, 30.0, valinit=f0, valstep=delta_f) # 添加频率滑块到频率axes中,滑块大小默认与axes大小相同
# 添加振幅axes
axamp = plt.axes([0.25, 0.15, 0.65, 0.03], facecolor=axcolor) # 在当前figure上绘制
samp = Slider(axamp, 'Amp', 0.1, 10.0, valinit=a0) # 添加振幅滑块到振幅axes中,滑块大小默认与axes大小相同
# 为滑块部件添加响应
def update(vak):
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) # 当频率滑块的值改变时,调用update
samp.on_changed(update) # 当振幅滑块的值改变时,调用update
# 复位按钮
resetax = plt.axes([0.8, 0.025, 0.1, 0.04]) # 在当前figure上绘制axes
button = Button(resetax, 'Reset', color=axcolor, hovercolor='0.975') # 添加按钮axes中
def reset(event):
sfreq.reset() # 频率滑块恢复到初始状态
samp.reset() # 振幅滑块回复到初始状态
button.on_clicked(reset) # 当复位按钮被点击时,执行reset函数
# 添加单选框
rax = plt.axes([0.025, 0.5, 0.15, 0.15], facecolor=axcolor) # 在当前figure中添加axes
radio =RadioButtons(rax, ('red', 'blue', 'green'), active=0) # 将单选框添加到axes中
def colorfunc(label):
l.set_color(label) # 设置曲线颜色,与单选框标签一致
fig.canvas.draw_idle() # 重新绘图
radio.on_clicked(colorfunc) # 当单选框选项被选中时,执行colorfunc函数
plt.show() # 显示figure
以上的绘图逻辑是,生成对应的axes,然后把相应的小部件添加到该axes中,且默认大小应该是填充该绘图区域(?)。
对于小部件,存在如下一些事件:
-
滑块的值发生改变
-
按钮被点击
-
单选框被选中
需要自定义一些函数,当上述事件发生时,这些函数会被调用。