我一直在尝试使用bokeh创建股票信息的仪表板,我希望有一个下拉菜单,当您单击其中一个选项时,该菜单会根据您单击的内容更改绘制的信息。
图形看起来不错,但是我无法使用下拉菜单进行更改。
最初,我认为这是bokeh服务器问题。现在,我在anaconda提示符中运行了“ bokeh serve”命令,并找到了以下示例:https://github.com/bokeh/bokeh/blob/1.3.4/examples/howto/server_embed/notebook_embed.ipynb的工作方式与我将代码复制并粘贴到jupyter笔记本中时的工作方式完全相同。但是,当我将代码修改为自己的数据并使用“选择”而不是“滑块”时,就会出现旧问题。
output_notebook()
def modify_dc(doc):
source = ColumnDataSource(dat[['Date','Close']])
#Making the glyphs
big = figure(x_axis_type='datetime', title="Zeiss stock dashboard")
p = big.line(x = "Date", y = "Close", line_width=2, source=source)
def update(attr, old, new):
if new == 'a':
data = dat[['Date','Traded Volume']]
else:
data = dat[['Date','Close']]
source1 = ColumnDataSource(data=data)
r.data_source.data = source1.data
menu = Select(options = ['a','b','c','d'],
value='a')
menu.on_change('value',update)
doc.add_root(row(menu,big))
show(modify_dc)
没有任何错误消息。有人可以帮忙吗?
答案 0 :(得分:0)
不要这样做:
r.data_source.data = source1.data
尽管它看起来像“常规” Python dict
,但是ColumnDataSource
的“ .data”属性实际上是一个非常专业的对象,它处理Python和JavaScript之间的所有自动同步,并且与创建它的CDS紧密相连。将.data
从一个CDS移到另一个CDS基本上是行不通的,并且,从今年晚些时候从Bokeh 2.0开始,尝试这样做将引发异常。
相反,您可以从普通的Python .data
设置CDS dict
:
source.data = { ... }
或在最新版本中,直接从熊猫DataFrame
:
source.data = some_df