Zyong
Zyong

Reputation: 9

python matplotlib widget doesn't work

Now I'm solving a problem using euler method. I made it as follow but even though i move the slidr the graph doesn't change

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)

Upvotes: 0

Views: 773

Answers (1)

ImportanceOfBeingErnest
ImportanceOfBeingErnest

Reputation: 339725

There is an example on how to use Slider on the Matplotlib page.

In that example one can see that the update function sets newly created or changed data via the set_ydata() to the matplotlib.lines.Line2D object representing the line of the plot.

In the code here, you try to set the data to the matplotlib.axes._subplots.AxesSubplot object, which will of course not work. It should actually throw and error, 'AxesSubplot' object has no attribute 'set_ydata'.

So the correct code should plot to an axes object and save the resulting Line2D for later usage.

ax=fig.add_subplot(111)
l, = ax.plot(x,y,linewidth=2,color="red")

For completeness, here the full working code:

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

Upvotes: 1

Related Questions