我试图用PointDrawTool在Jupyter笔记本的一个单元格中在散景图中绘制两个点,然后在另一个单元格中使用绘制点的坐标。
我从这个例子开始:
https://bokeh.pydata.org/en/latest/docs/user_guide/examples/tools_point_draw.html
...并对其稍加修改以在笔记本中输出:
from bokeh.plotting import figure, output_file, show, Column
from bokeh.models import DataTable, TableColumn, PointDrawTool, ColumnDataSource
from bokeh.io import output_notebook
output_notebook()
p = figure(
title='scope')
p.background_fill_color = 'lightgrey'
source = ColumnDataSource({
'x': [1, 5, 9], 'y': [1, 5, 9], 'color': ['red', 'green', 'yellow']
})
renderer = p.scatter(x='x', y='y', source=source, color='color', size=10)
columns = [TableColumn(field="x", title="x"),
TableColumn(field="y", title="y"),
TableColumn(field='color', title='color')]
table = DataTable(source=source, columns=columns, editable=True, height=200)
draw_tool = PointDrawTool(renderers=[renderer], empty_value='black')
p.add_tools(draw_tool)
p.toolbar.active_tap = draw_tool
#p.line(range(len(y)),y)
show(Column(p, table))
我在图中画了两个点。
在另一个笔记本单元格中:
len(source.data["x"])
它返回3。换句话说,我可以访问初始化“源”的三个点,但不能访问其后绘制的任何点。
有什么想法吗?
答案 0 :(得分:0)
如果要完全双向同步和通信,则需要嵌入Bokeh服务器应用程序。像上面一样,用普通的Bokeh对象调用show
只会一次性输出Bokeh JS内容,而无需与Python进行进一步通信。嵌入Bokeh Server应用程序通常涉及定义函数modify_doc(doc)
,该函数可以在每次调用show(modify_doc)
时创建一个新的bokeh服务器会话。您可以在此处看到完整的示例笔记本,其中有更多说明:
https://github.com/bokeh/bokeh/blob/0.13.0/examples/howto/server_embed/notebook_embed.ipynb
对于您的代码,更新后的工作版本如下:
非常重要的注意事项: 该应用程序的所有Bokeh对象,例如数据源,只能在modify_doc
内部创建。通常,您不能直接在modify_doc
外部创建或引用Bokeh对象。与应用“外部”同步的所有同步必须明确。例如。您可以根据需要在modify_doc
中的数据源上定义一个回调,该回调可更新另一个单元格中的某些可变数据结构。