使用滑块更新参数值(python)

使用滑块更新参数值(python),python,matplotlib,slider,Python,Matplotlib,Slider,我有一个微分方程组。解决方案取决于一个参数beta。我想创建一个滑块,以便可以更改此参数,并在绘图中直接显示解决方案曲线的更改。我想我快拿到了,但我错过了一块 我的代码 N = 1 #Initial conditions I0 = 0.01 S0= N - I0 #System of diff. equations def system(x, t, beta, gamma ): I, S = x dIdt = (beta/gamma*S-1)*I*gamma dSd

我有一个微分方程组。解决方案取决于一个参数beta。我想创建一个滑块,以便可以更改此参数,并在绘图中直接显示解决方案曲线的更改。我想我快拿到了,但我错过了一块

我的代码

N = 1

#Initial conditions
I0 = 0.01
S0= N - I0

#System of diff. equations
def system(x, t, beta, gamma ):
    I, S = x

    dIdt = (beta/gamma*S-1)*I*gamma
    dSdt = -(beta/gamma*S-1)*I*gamma

    return dIdt, dSdt

#Parameters initial value
beta = 0.03
gamma = 0.017

#Initial cond. vector
y0 = I0, S0

#time grid
t = np.linspace(0, 1300, 1300)

# Solution 
sol = odeint(system, y0, t, args=(beta, gamma))


################ Animations part ##################

fig, ax = plt.subplots()
plt.subplots_adjust(bottom = 0.25)

#solution curves for I and S
infected, = plt.plot(t, sol[:,0])
recovered, = plt.plot(t, sol[:,1])

axbeta = plt.axes([0.125, 0.1, 0.5, 0.05])

sliderbeta = Slider(axbeta, 'beta', 0, 1, valinit=beta)

def update_beta(val):
    beta_value = sliderbeta.val
    ??????????????????????????????????????
    fig.canvas.draw_idle()

sliderbeta.on_changed(update_beta)

plt.show()


我不知道如何获取我的初始beta值,以及如何用beta_值替换它。我猜在我的问号处少了一行

将任何ODE集成从全局范围中移除,并将其迁移到更新函数中。接下来,需要添加命令来计算并应用新的限制

I和S的解算曲线的线对象 已感染,=ax.plot([0],[0]) 已恢复,=ax.plot([0],[0]) def更新测试版(测试版): #如果在回调时触发,则会传递当前滑块值 #解决方案 sol=odeint(系统,y0,t,args=(β,γ)) #更新I和S的数据 已感染。设置_数据(t,sol[:,0]) 已恢复。设置_数据(t,sol[:,1]) #重新计算ax.dataLim ax.relim() #使用新的dataLim更新ax.viewLim ax.自动缩放视图() 图canvas.draw_idle() 最后,要在启动时获得初始绘图,请从全局范围调用此更新函数一次

update_beta(beta)

我照你说的做了。它不起作用。我不需要为我的滑块更改on_方法?是的,需要添加relim+自动缩放以使其正确显示。我没有提到的一切都保持原样,现在可以用了!非常感谢。我还有一个问题:如果我想添加一个按钮,这样点击它就会自动设置beta的转换动画,比如说从0到1?除了能够像现在一样手动设置之外。我很乐意找到一种方法。如果y轴不断地重新缩放,这种方法会很快在视觉上变得混乱。原则上,您可以在更新函数中进行循环,并使用暂停或睡眠函数来控制速度。如果转换循环的长度为1或10,则该按钮将更改。但我从未在matplotlib中尝试过类似的方法,所以可能有更好的方法。另请看matplotlib.animation。