Matplotlib の同じ軸にプロットされた複数のライン プロットがあります。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()
との間の線を削除するplotGraph()
とp.show()
、元のプロットが表示されます。