更新时间:2023-01-08 17:13:07
您应该注意函数的命名空间。
You should mind the namespaces of functions.
考虑
a = 0
def f():
a = 1
f()
print(a) # will print 0
因此,您需要处理实际对象,而不是它们的某些本地副本。
So you need to work on the actual objects and not some local copy of them.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.widgets import Slider, Button
n0 = 100
n1 = 1000
#Create figure object
fig, ax = plt.subplots(1,1)
plt.subplots_adjust(bottom=0.3)
#Create Sliders for parameters
axcolor = "skyblue"
axlam = plt.axes([0.20, 0.05, 0.20, 0.03], facecolor=axcolor)
slam = Slider(axlam, 'Exp lambda', 0, 5, valinit=1)
#Default distributions
dexp = [np.random.exponential(1, n1)]
##Updates distributions when sliders are changed
def updateDist(val):
lam = slam.val
dexp[0] = np.random.exponential(lam, n1)
slam.on_changed(updateDist)
#updates plot on FuncAnimation call
def update(curr):
if( curr == (n1-n0) ):
a.event.source.stop()
ax.clear()
bins_exp = np.arange(0,4/slam.val,0.25)
ax.hist(dexp[0][:(n0+curr)],bins=bins_exp)
ax.set_title('Exp n={}'.format(n0+curr))
fig.canvas.draw_idle()
#Define Start button and function to start animation
goax = plt.axes([0.8, 0.025, 0.1, 0.04])
button = Button(goax, 'Start', color=axcolor, hovercolor='0.975')
a = [0]
def start(event):
a[0] = animation.FuncAnimation(fig,update,interval=100)
button.on_clicked(start)
plt.show()