|
From: peterfR <pe...@pe...> - 2014-12-17 20:49:08
|
I have a simple oscillatory animation with a parameter "amp", which I control
with a slider.
The control works (when I do a mouse-drag on the slider bar), but the slide
bar never actually changes it's position because the reset call fails.
I don't see why the global statement should have any effect.
I want the "amp" variable to be common to the slider and the animation.
I'll include the whole code, it's only about 30 lines of executable code:
====
"""
A simple example of an animated plot, controlled by a slider
"""
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.widgets import Slider
fig, ax = plt.subplots()
amp = 5
freq = 1
t = np.arange(0.0, 2*np.pi*freq, 0.01)
print("len(t)=", len(t))
# INITIALIZE CURVE
line, = ax.plot(t, amp*np.sin(t), lw=4, color='purple')
# Setup slider
axcolor = 'lightgoldenrodyellow'
axamp = plt.axes([0.25, 0.15, 0.60, 0.03], axisbg=axcolor)
samp = Slider(axamp, 'Amp', 0.1, 10.0, valinit=amp)
def update(val):
global amp
amp = samp.val
# samp.set_val(amp)
# samp.reset() # if no argument given, the value of amp is not
changed.
# samp.reset(amp) # If used, amp is changed, the animation continues
with changed amp value,
# but the slider bar does
# not move and get the error "TypeError:
reset() takes exactly 1 argument (2 given)"
samp.on_changed(update)
def reset(event):
samp.reset()
## Do the animation
def animate(i):
line.set_ydata(amp*np.sin(t+(i/10.0))) # update the data
return line,
#Init only required for blitting to give a clean slate.
def init():
line.set_ydata(np.ma.array(t, mask=True))
return line,
ani = animation.FuncAnimation(fig, animate, np.arange(1, 100000),
init_func=init,
interval=20, repeat=True, repeat_delay=200, blit=True)
plt.show()
--
View this message in context: http://matplotlib.1069221.n5.nabble.com/Possible-bug-in-slider-reset-tp44638p44640.html
Sent from the matplotlib - users mailing list archive at Nabble.com.
|