这是对代码的简单修改,以添加动画:
import numpy as npimport matplotlib.pyplot as pltimport matplotlib.animation as animationfrom matplotlib.widgets import SliderTWOPI = 2*np.pifig, ax = plt.subplots()t = np.arange(0.0, TWOPI, 0.001)initial_amp = .5s = initial_amp*np.sin(t)l, = plt.plot(t, s, lw=2)ax = plt.axis([0,TWOPI,-1,1])axamp = plt.axes([0.25, .03, 0.50, 0.02])# Slidersamp = Slider(axamp, 'Amp', 0, 1, valinit=initial_amp)# Animation controlsis_manual = False # True if user has taken control of the animationinterval = 100 # ms, time between animation framesloop_len = 5.0 # seconds per loopscale = interval / 1000 / loop_lendef update_slider(val): global is_manual is_manual=True update(val)def update(val): # update curve l.set_ydata(val*np.sin(t)) # redraw canvas while idle fig.canvas.draw_idle()def update_plot(num): global is_manual if is_manual: return l, # don't change val = (samp.val + scale) % samp.valmax samp.set_val(val) is_manual = False # the above line called update_slider, so we need to reset this return l,def on_click(event): # Check where the click happened (xm,ym),(xM,yM) = samp.label.clipbox.get_points() if xm < event.x < xM and ym < event.y < yM: # Event happened within the slider, ignore since it is handled in update_slider return else: # user clicked somewhere else on canvas = unpause global is_manual is_manual=False# call update function on slider value changesamp.on_changed(update_slider)fig.canvas.mpl_connect('button_press_event', on_click)ani = animation.FuncAnimation(fig, update_plot, interval=interval)plt.show()主要变化是
update_plot功能的添加,该功能用于
FuncAnimation在倒数第二行中添加a。动画从设置的最后一个滑块值开始递增。
该变量
is_manual跟踪用户何时单击滑块。用户单击它之后,变量将设置为
True,并且动画将不再更新绘图。
为了恢复动画,我添加了一个
on_click功能,该功能设置
is_manual = False用户何时单击画布上滑块以外的其他位置。
由于这是一个快速处理的脚本,因此我将变量保留为全局变量,但是您可以轻松地将其编写在适当的类中。
请注意,
samp.set_val隐式调用会调用该
update_slider函数,当用户直接单击滑块时也会调用该函数,因此我们必须
is_manual在该
update_plot函数中进行重置。



