2016-12-04 1 views
0

이제 오일러 메서드를 사용하여 문제를 해결하고 있습니다. 나는 다음과 같이 그것을했지만 내가 slidr를 이동하더라도 그래프는 Matplotlib pageSlider을 사용하는 방법에 대한 예제가있다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

변경되지 않습니다.

이 예에서는 set_ydata()을 통해 update 함수가 새로 작성되거나 변경된 데이터를 플롯의 선을 나타내는 matplotlib.lines.Line2D 개체로 설정한다는 것을 알 수 있습니다.

여기서 코드에서 데이터를 matplotlib.axes._subplots.AxesSubplot 개체로 설정하려고합니다. 물론 작동하지 않습니다. 실제로 throw하고 오류, 'AxesSubplot' object has no attribute 'set_ydata'합니다.

올바른 코드는 axes 개체에 플롯해야하고 나중에 사용하기 위해 결과로 Line2D을 저장해야합니다. 이러한 예

http://matplotlib.org/users/screenshots.html#slider-demo

그리고 여기에 몇 가지 좋은 사례가에서

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() 
관련 문제