Python 无法使用选择小部件初始化Bokeh仪表板

Python 无法使用选择小部件初始化Bokeh仪表板,python,pandas,bokeh,Python,Pandas,Bokeh,这是我第一次体验博克人,所以如果我问了一个非常愚蠢的问题,我很抱歉。这是代码。我有一个数据框,其中包含几个人的分数。我想画一条时间序列线,x轴上有年份,y轴上有分数,还有一个选择菜单来选择球员 这是我目前所拥有的,但我已经触礁了。我错过了什么 import pandas as pd import numpy as np from bokeh.layouts import row, column from bokeh.models import ColumnDataSource, Select f

这是我第一次体验博克人,所以如果我问了一个非常愚蠢的问题,我很抱歉。这是代码。我有一个数据框,其中包含几个人的分数。我想画一条时间序列线,x轴上有年份,y轴上有分数,还有一个选择菜单来选择球员

这是我目前所拥有的,但我已经触礁了。我错过了什么

import pandas as pd
import numpy as np
from bokeh.layouts import row, column
from bokeh.models import ColumnDataSource, Select
from bokeh.io import output_file, show
from bokeh.plotting import figure

players = {'AJ':'Alex Jones', 'CH':'Chris Humps', 'BH':'Brian Hill', 'CM':'Chris Matta',
                 'JB':'Jim Bellami'}

data = pd.DataFrame({'score_AJ':[6, 7, 5, 4, 3], 'score_CH':[4, 2, 4, 1, 3], 'score_BH':[7, 3, 2, 7, 6],
                     'score_CM':[1, 1, 3, 2, 4], 'score_JB':[2, 3, 3, 5, 6]})

data.index = pd.period_range(start='2015-01-01', end='2019-01-01', freq='A')

output_file("test.html")

player_select = Select(title='Player:', value="Chris Matta", options=sorted(players.values()))

def update_data(attr, old, new):
    player = [key for (key, value) in players.items() if value == player_select.value]
    df = pd.DataFrame({'year': data.index, 'score': data['score_'+ player]})
    return ColumnDataSource(data=df)

def plot_charts(source):
    chart = figure(width=600, plot_height = 300, x_axis_type ='datetime', title = 'Player score')
    chart.line('year', 'score', color='midnightblue', line_width=2, alpha=1, source = source)
    return chart

player_select.on_change('value', update_data)

chart = plot_charts(source)
main_row = row(chart, player_select)
show(main_row)
谢谢大家!

如上所述,使用真正的Python回调需要将代码作为应用程序在Bokeh服务器上运行。这是因为web浏览器既不了解Python代码,也不具备运行Python代码的能力。真正的Python回调意味着有一些实际运行的Python进程可以运行Python回调代码。在本例中,该进程就是Bokeh服务器,Bokeh服务器就是这样存在的

现在,show函数用于生成独立的,即非Bokeh服务器输出。在静态文件中只包含纯HTML和JS。鉴于此,真正的Python回调无法与show一起工作

所以你有两个选择:

将其作为Bokeh服务器应用程序重新编写,在这种情况下,您应该首先参考《用户指南》中的必要上下文。然后,使用Bokeh服务器应用程序,从您可以模拟的选择更新数据。 或者,重新编写此代码,以仅使用CustomJS回调,而不使用Python回调。只使用JS回调绝对可以完成这类工作,在这种情况下,使用show创建的独立输出将起作用。请参阅,了解从小部件上的JS回调更新内容的背景和许多示例。 除此之外,还有其他一些杂项问题。即这一行:

chart.line('year', 'score', ...)

告诉Bokeh在数据源中查找x值的“year”列,以及y值的“score”列。但是,您的数据源没有这两列。它有一些列名为score_AJ等,根本没有年份列

谢谢你,老顽固。这很有帮助。