散景复选框仅在选中时更新
Bokeh checkbox only updates when its checked
我正在使用散景服务器绘制折线图,其中有一个复选框按钮,如果选中该按钮,该按钮将翻转该线。如果未选中,我想查看该行的原始版本(未翻转)。在 flip/unflip 之后,调用第二个函数来执行一些其他计算:
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
,因此为了翻转(或取消翻转)信号,我需要单击它两次。例如,当我取消选中该框时,什么也没有发生,但我希望它能解除信号。相反,如果我取消选中然后再次选中该框,它只会取消信号
每次单击按钮时都会使用正确的值调用回调,这可以通过某些 print
语句进行验证。错误在你的逻辑中。由于您是在 current 信号上操作,而不是某些 original 信号,您大概 always 想要无条件地每次翻转。目前,你只是翻转每隔一个按钮按下,因为这个 flip_signal(..., False)
只是 returns 信号按原样传入。将 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
的函数。您需要一个函数,它始终 returns False
上的原始未翻转信号,并且始终 returns True
上的翻转信号。将此与当前的 flip_signal
进行对比,如果您使用 False
调用它,它会返回您传入的任何内容,无论它是翻转信号还是未翻转信号。
我正在使用散景服务器绘制折线图,其中有一个复选框按钮,如果选中该按钮,该按钮将翻转该线。如果未选中,我想查看该行的原始版本(未翻转)。在 flip/unflip 之后,调用第二个函数来执行一些其他计算:
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
,因此为了翻转(或取消翻转)信号,我需要单击它两次。例如,当我取消选中该框时,什么也没有发生,但我希望它能解除信号。相反,如果我取消选中然后再次选中该框,它只会取消信号
每次单击按钮时都会使用正确的值调用回调,这可以通过某些 print
语句进行验证。错误在你的逻辑中。由于您是在 current 信号上操作,而不是某些 original 信号,您大概 always 想要无条件地每次翻转。目前,你只是翻转每隔一个按钮按下,因为这个 flip_signal(..., False)
只是 returns 信号按原样传入。将 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
的函数。您需要一个函数,它始终 returns False
上的原始未翻转信号,并且始终 returns True
上的翻转信号。将此与当前的 flip_signal
进行对比,如果您使用 False
调用它,它会返回您传入的任何内容,无论它是翻转信号还是未翻转信号。