同时只有一个 CheckButton,matplotlib.widgets

问题描述

我想用 Python 以交互方式更改函数的参数,显示图形,还想有两个按钮,只能同时激活一个。 我通过 FuncAnimationmatplotlib.animationSlidermatplotlib.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 (将#修改为@)