Bokeh复选框仅在选中时更新

2024-03-28 18:35:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用bokeh服务器绘制一个线图,其中有一个复选框按钮,如果选中该线,它将翻转该线。如果它未选中,我想看到原始版本的行(未折叠)。在翻转/取消翻转之后,将调用第二个函数来执行其他一些计算:

import numpy as np
from bokeh.io import curdoc
from bokeh.layouts import row, widgetbox, layout
from bokeh.models import ColumnDataSource
from bokeh.models.widgets import CheckboxGroup
from bokeh.plotting import figure


def flip_signal(signal, flip):
    if flip:
        signal = -signal
    else:
        signal = signal

    return signal


N = 200
x = np.linspace(0, 4*np.pi, N)
y = np.sin(x)
source = ColumnDataSource(data=dict(x=x, y=y))

plot = figure(plot_height=500, plot_width=850, title="test",
              tools="crosshair,pan,reset,save,wheel_zoom")
line_orig = plot.line('x', 'y', source=source, line_width=1, line_alpha=1)

flip_signal_btn = CheckboxGroup(labels=["Flip signal"])


def update_flip(attrname, old, new):
    if 0 in flip_signal_btn.active:
        flip = True
    else:
        flip = False

    # Update plot
    source.data = dict(x=source.data['x'], y=flip_signal(source.data['y'], flip))


def update_peaks(attrname, old, new):
    # do something else
    pass  


for w in [flip_signal_btn]:
    w.on_change('active', update_flip)
    w.on_change('active', update_peaks)

options = widgetbox(flip_signal_btn)
doc_layout = layout(row([options], height=200))

curdoc().add_root(row(plot, doc_layout, width=800))
curdoc().title = "checkbox"

复选框似乎只在选中时调用update_flip,因此为了翻转(或取消翻转)信号,我需要单击它两次。例如,当我取消选中该框时,什么都不会发生,但我希望它能释放信号。相反,只有当我取消选中并再次选中该复选框时,它才会释放信号


Tags: fromimportsourcedatasignalplotnpline
1条回答
网友
1楼 · 发布于 2024-03-28 18:35:29

每次单击按钮时都会使用正确的值调用回调,这可以通过一些print语句进行验证。你的逻辑出了问题。因为你是在电流信号上工作,而不是某个原始信号,你大概每次都想无条件地翻转。目前,您只需每隔一次按一次按钮就翻转一次,因为这个flip_signal(..., False)只返回传入的信号。将update_flip回调更改为始终翻转将产生您想要的行为:

def update_flip(attrname, old, new):
    # flip the *current* data on *every* button toggle
    source.data = dict(x=source.data['x'], y=flip_signal(source.data['y'], True))

要使逻辑正常工作,您需要一个与当前的flip_signal不同的函数。您需要一个函数,它总是在False上返回原始的未折叠信号,并始终在True上返回翻转信号。与当前的flip_signal相比,如果你用False来调用它,它将返回你传入的任何内容,而不管它是翻转的还是未折叠的信号。在

相关问题 更多 >