首页 > 解决方案 > 无法使用 Select 小部件初始化 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)

谢谢!

标签: pythonpandasbokeh

解决方案


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

现在,该show功能用于生成独立(即非散景服务器)输出。只是静态文件中的纯 HTML 和 JS。鉴于此,真正的 Python 回调无法与show.

所以你有两个选择:

  • 将其重新设计为 Bokeh Server 应用程序,在这种情况下,您应首先参考用户指南中的运行 Bokeh Server以获取必要的上下文。然后,这是一个 Bokeh 服务器应用程序的完整示例Select,它可以从您可以模拟的设备中更新数据。
  • 或者,将其重新设计为仅使用CustomJS回调,而不使用 Python 回调。绝对有可能只使用 JS 回调来做这种事情,在这种情况下,使用创建的独立输出show将起作用。有关背景信息,请参阅JavaScript 回调以及许多从小部件上的 JS 回调更新事物的示例。

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

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

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


推荐阅读