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

时间:2019-11-15 00:53:07

标签: python pandas bokeh

这是我第一次在Bokeh工作,所以如果我在这里问一个非常愚蠢的问题,我深表歉意。所以,这是代码。我有一个数据框,其中包含几个人的分数。我想在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)

谢谢!

1 个答案:

答案 0 :(得分:1)

使用真实的Python回调(如上所述)需要将代码作为应用程序在Bokeh服务器上运行。这是因为Web浏览器不了解Python代码,也不具有运行Python代码的能力。真正的Python回调意味着有一些实际运行的Python进程可以运行Python回调代码。在这种情况下,该过程就是Bokeh服务器(即Bokeh服务器存在的)。

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

因此,您有两种选择:

  • 将其作为Bokeh Server应用程序进行重做,在这种情况下,应首先参考《用户指南》中的Running a Bokeh Server,以获取必要的上下文信息。然后,使用here is a complete example的Bokeh服务器应用程序更新您可以仿真的Select的数据。
  • 或者,将其重做为仅使用CustomJS回调,而不使用Python回调。绝对可以仅使用JS回调来执行此类操作,在这种情况下,使用show创建的独立输出将起作用。请参阅JavaScript Callbacks,以获取背景以及通过小部件上的JS回调更新内容的许多示例。

除此之外,还有其他一些其他问题。即此行:

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

告诉Bokeh ”“在数据源中查找x值名为'year'的列,为y值查找名为'score'的列。。但是,您的数据源没有这些列。它具有名为“ score_AJ”等名称的列,根本没有“ year”列。