Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 点击成功小部件上的Bokeh重置图_Python_Bokeh - Fatal编程技术网

Python 点击成功小部件上的Bokeh重置图

Python 点击成功小部件上的Bokeh重置图,python,bokeh,Python,Bokeh,我试图创建一个小部件回调函数,将整个绘图重置为其初始化状态,但它不工作。我希望用户点击Sample任意次数,然后能够将vbar绘图重置为其初始化状态 我已经创建了python回调函数,并使用了一些打印函数进行了一些调试,但绘图没有重置 plot2 = figure(plot_height=400, plot_width=int(1.618*600), title="Block Party", tools="crosshair,reset,save",

我试图创建一个小部件回调函数,将整个绘图重置为其初始化状态,但它不工作。我希望用户点击Sample任意次数,然后能够将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的任何想法?

Bokeh绘图不会仅仅因为被创建而显示出来。在Bokeh服务器应用程序中,它们必须放在布局中并添加到
curdoc
。你大概是这样做的:

curdoc.add_root(plot2)
如果要在浏览器中替换
plot2
,则必须在
curdoc
中替换它。在回调中创建的
plot2
只是函数中的局部变量。它在函数的持续时间内突然存在,只存在于函数内部,然后在函数结束时被丢弃。你还没有用它做任何事。要在
curdoc
中实际替换,以显式布局存储绘图会更容易:

lauyot = row(plot)
curdoc().add_root(layout)
然后在回调中,可以替换布局中的内容:

layout.children[0] = new_plot
尽管如此,我还是建议不要这样做。Bokeh的一般、始终适用的最佳实践是:

总是尽可能地做出最小的改变

Bokeh绘图有十几个子组件(范围、轴、图示符、数据源、工具等),交换整个绘图是一项非常繁重的操作,相反,您应该做的只是更新已有绘图的数据源,以恢复它开始时的数据:

source2.data = original_data_dict  # NOTE: set from plain python dict

这将恢复酒吧的原始状态,使最小的变化可能。这就是Bokeh在高效的内部实现和高效的编码API方面优化的用途

嗯。我尝试过这个,但它不能与点击成功小部件一起工作。如果没有完整的最小代码示例,就不可能进行推测。另外,我在文档和示例中提到的模式有很多示例。