以下脚本(来自this SO answer)生成一个simpleapp Bokeh图。
如何将输出保存到独立的html文件?
import bokeh.plotting as bk
from bokeh.models import ColumnDataSource, Plot
from bokeh.models.widgets import Select, AppVBox
from bokeh.simpleapp import simpleapp
data = {"a": {"x": [1,2,3], "y": [1,2,3]},
"b": {"x": [3,2,1], "y": [1,2,3]},
"c": {"x": [2,2,2], "y": [1,2,3]},}
options = ["a", "b", "c"]
select1 = Select(name = 'ticker1', value = options[0], options = options)
@simpleapp(select1)
def test_layout(ticker1):
p = bk.figure(title = "layout test")
chart_data = data[ticker1]
df = ColumnDataSource(data = chart_data)
p.circle(x = chart_data["x"], y = chart_data["y"])
return {'plot': p}
@test_layout.layout
def layout(app):
return AppVBox(app=app, children=['ticker1', 'plot'])
test_layout.route("/bokeh/layout/")
我尝试更改layout(app)
以使用file_html
。这会生成初始图,但组合框不起作用。我认为file_html
仅适用于单个绘图对象,而不适用于我正在使用的simpleapp
之类的内容。
from bokeh.embed import file_html
from bokeh.resources import CDN
def layout(app):
# save standalone html
html = file_html(AppVBox(app=app, children=['ticker1', 'plot']), CDN, "title")
f = open("bokeh_standalone.html", "w")
f.write(html)
f.close
答案 0 :(得分:1)
目前没有太多关于Bokeh的文档,因此一些简单的任务可能看起来有点不足。 TL; DR:通过扩展它来使用提供的示例here。
但是,要启用“选择”框,您需要执行的操作是在其上调用on_change('value', func)
,其中func
是可更新数据源的可调用对象。完成后,您可以设置datasource._dirty = True
。重要的是,所有这些事情都必须发生在属于名为setup_events
的应用类的另一个方法中。
散景服务器处理交互的方式是创建对象的新python实例,这些对象存储在其选定的内部数据库中(默认情况下为redis)。这意味着每次都需要“设置事件”。
我强烈建议在Bokeh Github页面上阅读ContinuumIO提供的Sliders App示例:https://github.com/bokeh/bokeh/tree/master/examples/app/sliders_applet
过去几周我一直在为此而拔头发,但我们每天都越来越了解。我希望这会有所帮助:)