我正在尝试创建一个小部件回调函数,该函数将整个图重置为初始化状态,但无法正常工作。我希望用户可以根据需要多次单击“采样”,然后将vbar图重置为其初始状态。
我已经创建了python回调函数,并使用了一些打印函数来进行调试,但该图未重置。
plot2 = figure(plot_height=400, plot_width=int(1.618*600), title="Block Party",
tools="crosshair,reset,save",
x_range=[0, 11], y_range=[0, max(counts)])
plot2.vbar(x='x', top='y', source=source2, width=0.8)
"""
Set up widgets
"""
title2 = TextInput(title="Plot Title", value='Blocks')
sample = Button(label="Sample", button_type="success")
reset = Button(label="Reset", button_type="success")
# Callback
def reset_window_2():
global source2
print("I was clicked")
np.random.seed(42)
unique, counts = np.unique(np.random.randint(low=1, high=11, size=100), return_counts=True)
source2 = ColumnDataSource(data=dict(x=unique, y=counts))
plot2 = figure(plot_height=400, plot_width=int(1.618 * 600), title="Block Party",
tools="crosshair,reset,save",
x_range=[0, 11], y_range=[0, max(counts)])
plot2.vbar(x='x', top='y', source=source2, width=0.618)
reset.js_on_click(CustomJS(args=dict(p=plot2), code="""
plots2.reset.emit()
"""))
print("Check 2")
reset.on_click(reset_window_2)
# Set up layouts and add to document
inputs1 = column(title1, sigma, mu)
inputs2 = column(title2, sample, reset)
tab1 = row(inputs1, plot1, width=int(phi*400))
tab2 = row(inputs2, plot2, width=int(phi*400))
tab1 = Panel(child=tab1, title="Like a Gauss")
tab2 = Panel(child=tab2, title="Sampling")
tabs = Tabs(tabs=[tab1, tab2])
curdoc().add_root(tabs)
curdoc().title = "Sample Dash"
有打印功能,但没有复位。关于如何将整个图重置为init的任何想法?
答案 0 :(得分:3)
散景图不会仅仅由于创建而显示。在Bokeh服务器应用程序中,必须将它们放置在布局中并添加到curdoc
中。您大概是这样做的:
curdoc.add_root(plot2)
如果要在浏览器中替换plot2
,则必须在curdoc
中替换它。您在回调中创建的plot2
只是函数中的局部变量。它在功能持续时间内突然存在,仅存在于功能内部,然后在功能结束时被丢弃。您实际上并没有做任何事情。要实际替换为curdoc
,将图形存储在显式布局中会更容易:
lauyot = row(plot)
curdoc().add_root(layout)
然后在回调中,您可以替换布局中的内容:
layout.children[0] = new_plot
所有所说的 ,我实际上建议不要这样做。 Bokeh的通用,最佳实践是:
始终进行尽可能小的更改。
散景图包含许多子组件(范围,轴,字形,数据源,工具,...)交换整个图是一项非常繁重的操作,相反,您应该要做的只是更新您已有图的数据源,以恢复其开始的数据:
source2.data = original_data_dict # NOTE: set from plain python dict
这将使条恢复到原始状态,并进行最小的更改。这是Bokeh在有效的内部实现以及有效的编码API方面都经过优化的用法。