我正在尝试替换一些根对象。带有插入替换的方法效果很好。
from bokeh.io import curdoc
from bokeh.plotting import figure
from bokeh.models.widgets.buttons import Button
from bokeh.models import Plot, Column
from bokeh.plotting.figure import Figure
from bokeh.layouts import column
import numpy as np
N = 2
x = np.random.random(size=N) * 100
y = np.random.random(size=N) * 100
p = figure(name='fig', width=300, height=200)
p.scatter(x, y, size=10, fill_color='red',)
def overrides_plot():
print('Overriding with new plot')
N = 2
x = np.random.random(size=N) * 100
y = np.random.random(size=N) * 100
p2 = figure(name='fig2', width=300, height=200)
p2.scatter(x, y, size=10, fill_color='blue',)
curdoc().clear()
col = column(children=[p2, ov, ov2], name='main_column')
curdoc().add_root(col) # this adds the objects at the bottom, instead of the template place
ov = Button(
name='override',
label='Override',
button_type='success',
width=50
)
ov.on_click(overrides_plot)
def overrides_plot2():
print('Overriding with new plot with remove/insert')
N = 2
x = np.random.random(size=N) * 100
y = np.random.random(size=N) * 100
p3 = figure(name='fig3', width=300, height=200)
p3.scatter(x, y, size=10, fill_color='black',)
p = curdoc().select_one(selector=dict(type=Figure))
c = curdoc().select_one(selector=dict(type=Column))
c.children.remove(p)
c.children.insert(0, p3)
ov2 = Button(
name='override',
label='Overrides with remove/insert',
button_type='success',
width=50
)
ov2.on_click(overrides_plot2)
c = column(children=[p, ov, ov2], name='main_column')
curdoc().add_root(c)
使用方法overrides_plot
,对象将添加到底部而不是模板位置:
模板:
{% extends base %}
{% block contents %}
<div class="container body">
<div class="main_container">
<div>
{{ embed(roots.main_column) }}
</div>
</div>
</div>
{% endblock %}
那么这些方法仍然有用吗?
curdoc().clear()
curdoc().remove_root()
答案 0 :(得分:1)
它们是,您在这里看到的是一个完全有效的行为。问题在于,新创建的根模型具有与bokeh从初始嵌入中得知的ID不同的ID。要解决此问题,您可以创建具有与原始模型相同的ID的新根(因此col = column(id=c._id, ...)
)。这样,bokeh会将新的根嵌入到模板的原始插槽中。但是,修改根目录应该是最后使用的方法。最好修改现有的模型或布局(就像在overrides_plot2
中所做的那样。)