Существует пример того, как использовать Slider
на Matplotlib page.
В этом примере видно, что функция update
устанавливает новые или измененные данные через set_ydata()
в объект matplotlib.lines.Line2D
, представляющий линию участка.
В коде здесь вы пытаетесь установить данные на объект matplotlib.axes._subplots.AxesSubplot
, который, конечно же, не будет работать. Он должен действительно бросать и ошибаться, 'AxesSubplot' object has no attribute 'set_ydata'
.
Таким образом, правильный код должен быть привязан к объекту axes
и сохранить полученный результат Line2D
для последующего использования.
ax=fig.add_subplot(111)
l, = ax.plot(x,y,linewidth=2,color="red")
Для полноты здесь полный рабочий код:
from __future__ import division
from matplotlib import pyplot as plt
from matplotlib.widgets import Slider
t0=0
Q0=0.001
tf=25
N0=5
Nmax=10000
dN0=Q0/(1+Q0)*(1-N0/Nmax)*N0
n=100
deltat=(tf-t0)/(n-1)
tlist=[t0]
Nlist=[N0]
Qlist=[Q0]
dNlist=[dN0]
for i in range(1,n):
Nlist.append(Nlist[i-1]+dNlist[i-1]*deltat)
Qlist.append(Qlist[i-1]+Qlist[i-1]*deltat)
dNlist.append(Qlist[i]/(1+Qlist[i])*(1-Nlist[i]/Nmax)*Nlist[i])
tlist.append(t0+i*deltat)
x=tlist
y=Nlist
fig=plt.figure()
#########
### Changes here:
ax=fig.add_subplot(111)
fig.subplots_adjust(left=0.25, bottom=0.25)
l, = ax.plot(x,y,linewidth=2,color="red")
###########
plt.xlabel("Value of t")
plt.ylabel("Value of N")
plt.title("Euler Method")
axcolor = 'lightgoldenrodyellow'
axQ0 = fig.add_axes([0.25, 0.15, 0.65, 0.03], axisbg=axcolor)
axNmax = fig.add_axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor)
axN0 = fig.add_axes([0.25, 0.05, 0.65, 0.03], axisbg=axcolor)
sQ0 = Slider(axQ0, 'init_Temp', 0, 0.1, valinit=Q0)
sNmax = Slider(axNmax, 'N_max', 1000, 100000, valinit=Nmax)
sN0 = Slider(axN0, "init_N",1,10,valinit=N0)
def update(val):
ini_Q = sQ0.val
ini_Nmax = sNmax.val
ini_N =sN0.val
ini_dN=ini_Q/(1+ini_Q)*(1-ini_N/ini_Nmax)*ini_N
tlist2=[t0]
Nlist2=[ini_N]
Qlist2=[ini_Q]
dNlist2=[ini_dN]
for i in range(1,n):
Nlist2.append(Nlist2[i-1]+dNlist2[i-1]*deltat)
Qlist2.append(Qlist2[i-1]+Qlist2[i-1]*deltat)
dNlist2.append(Qlist2[i]/(1+Qlist2[i])*(1-Nlist2[i]/ini_Nmax)*Nlist2[i])
tlist2.append(t0+i*deltat)
l.set_ydata(Nlist2)
fig.canvas.draw_idle()
sQ0.on_changed(update)
sNmax.on_changed(update)
sN0.on_changed(update)
plt.show()