散景重置图成功小部件上单击

时间:2019-06-04 00:44:20

标签: python bokeh

我正在尝试创建一个小部件回调函数,该函数将整个图重置为初始化状态,但无法正常工作。我希望用户可以根据需要多次单击“采样”,然后将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的任何想法?

1 个答案:

答案 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方面都经过优化的用法。