I have multiple lines plots that are plotted on the same axes in Matplotlib. I'm trying to use the Slider widget to adjust the lines, but for some reason only the first line plot is showing, and nothing is updated when I move the slider:
import matplotlib.pyplot as p
from matplotlib.widgets import Slider, Button, RadioButtons
Kd=0.0
Ks=0.0
mass=0.02
width=900
yPosition = []
yVelocity = []
yTarget = []
yForce = []
lpos= []
lvel = []
ltarget = []
lforce = []
def runSimulation(positionGain=1.5, velocityGain=60.0):
global Kd, Ks, mass, yPosition, yVelocity, yTarget, yForce, width
velocity = 0.0
acceleration = 0.0
reference = 100.0
target = 0.0
position = 0.0
force = 0.0
T=0.0005
yPosition = []
yVelocity = []
yTarget = []
yForce = []
for i in range(0,width*10):
acceleration = (force - Kd*velocity - Ks*position)/mass
# Equations of motion for constant acceleration
position = position + (velocity*T) + (0.5*acceleration*T*T)
velocity = velocity + acceleration*T
e1 = target - position # Output of 1st control system
e2 = positionGain * e1 - velocity # Output of 2nd control system
force = velocityGain * e2
if i % 10 == 0: #Plot 1 point for every 10 iterations of simulation
if i>=30:
target = reference
else:
target = 0
yPosition.append(position)
yVelocity.append(velocity*0.1)
yTarget.append(target)
yForce.append(force*0.001)
def plotGraph():
global yPosition, yVelocity, yTarget, yForce, lpos, lvel, ltarget, lforce
x = range(0,width)
ax = p.subplot(111)
lpos, = ax.plot(x,yPosition,'r')
lvel, = ax.plot(x,yVelocity,'g')
ltarget, = ax.plot(x,yTarget,'k')
lforce, = ax.plot(x,yForce,'b')
ax = p.subplot(111)
p.subplots_adjust(left=0.25, bottom=0.25)
runSimulation()
plotGraph()
p.axis([0, 1, -10, 10])
axcolor = 'lightgoldenrodyellow'
axpos = p.axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor)
axvel = p.axes([0.25, 0.15, 0.65, 0.03], axisbg=axcolor)
spos = Slider(axpos, 'Position Gain', 1.0, 20.0, valinit=1.5)
svel = Slider(axvel, 'Velocity Gain', 5.0, 500.0, valinit=60.0)
def update(val):
global yPosition,yVelocity,yTarget,yForce
runSimulation(round(spos.val,2),round(svel.val,2))
lpos.set_ydata(yPosition)
lvel.set_ydata(yVelocity)
ltarget.set_ydata(yTarget)
lforce.set_ydata(yForce)
p.draw()
spos.on_changed(update)
svel.on_changed(update)
p.show()
If you remove the lines between plotGraph() and p.show() you can see the original plots.