2016-12-04 11 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

変更されません。

この例では、1つは、update機能セットが新たに作成されたことを確認することができ、またはプロットの線を表すmatplotlib.lines.Line2Dオブジェクトにset_ydata()を介してデータを変更しました。

ここのコードでは、データを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") 

、完全な作業コード:これらの例

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()