问题描述
我想用 Python
以交互方式更改函数的参数,显示图形,还想有两个按钮,只能同时激活一个。
我通过 FuncAnimation
的 matplotlib.animation
和 Slider
的 matplotlib.widgets
实现的第一部分。 (我对此发表评论,以防万一有更好的方法来做到这一点,因为我只想在参数改变时更新,也许动画不是最好的方法)。
问题出在 CheckButton
部分。当单击一个框时,我无法做到这一点,另一个未选中。在功能上它有效,因为它改变了我想要的标志,但不是图形化的。
这是我现在所拥有的:
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.widgets import Slider,CheckButtons
import math
%matplotlib notebook
# Initials values
MU_init = 25
SIGMA_init = 7.5
LENG = 1000
Black_win = 1
mu_negro = 25
sigma_negro = 7.5
# Animation controls
interval = 100 # ms,time between animation frames
loop_len = 5.0 # seconds per loop
scale = interval / 1000 / loop_len
def gaussian(x_data):
global mu_negro,sigma_negro
y = np.zeros(LENG)
for i in range(LENG):
y[i] = 1/(math.sqrt(2*math.pi)*sigma_negro)*math.exp(-(x_data[i]-mu_negro)**2/(2*sigma_negro**2))
return y
fig,ax = plt.subplots()
# Initialize
x_data = np.linspace(MU_init-3*SIGMA_init,MU_init+3*SIGMA_init,LENG)
y_data = gaussian(x_data)
ax.set(xlim=(x_data[0],x_data[-1]),ylim=(0,0.5))
line,= plt.plot(x_data,y_data,color="steelblue",label="Prior Negro")
# Slider
axmu = plt.axes([0.25,.04,0.50,0.02])
axsigma = plt.axes([0.25,.01,0.450,0.02])
slider_mu = Slider(axmu,r'$\mu$',2*MU_init,valinit=MU_init)
slider_sigma = Slider(axsigma,r'$\sigma$',1,SIGMA_init/2,valinit=SIGMA_init)
# CheckButtons
col = (0,0.2,0.7,0.2)
rax = plt.axes([0.15,0.65,0.2],facecolor=col,alpha=0.1)
origState = (True,False)
check = CheckButtons(rax,('Black_win','White_win'),origState)
def update_slider_mu(mu):
global mu_negro
mu_negro = mu
line.set_ydata(gaussian(x_data))
# redraw canvas while idle
fig.canvas.draw_idle()
def update_slider_sigma(sigma):
global sigma_negro
sigma_negro = sigma
line.set_ydata(gaussian(x_data))
# redraw canvas while idle
fig.canvas.draw_idle()
def animate(num):
val = slider_mu.val
slider_mu.set_val(val)
val2 = slider_sigma.val
slider_sigma.set_val(val2)
check.on_clicked(func)
return line,# call update function on slider value change
slider_mu.on_changed(update_slider_mu)
slider_sigma.on_changed(update_slider_sigma)
def func(label):
global Black_win
if label == 'Black_win':
Black_win = 1
elif label == 'White_win':
Black_win = 0
plt.draw()
ani = animation.FuncAnimation(fig,animate,interval=interval,blit=False)
ax.legend()
plt.show()
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)