2016-12-04 6 views
0

Теперь я решаю проблему с использованием метода эйлеров. Я сделал это следующим образом, но даже если я переместить slidr граф не изменяетВиджет python matplotlib не работает

from math import exp 
import numpy as np 
from matplotlib import pyplot as plt 
from matplotlib.widgets import Slider, Button, RadioButtons 


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() 
l=fig.add_subplot(111) 
fig.subplots_adjust(left=0.25, bottom=0.25) 
l.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) 

ответ

1

Существует пример того, как использовать 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() 
Смежные вопросы