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

问题描述 投票:0回答:1

这是我第一次在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)

谢谢!

python pandas bokeh
1个回答
0
投票
如上所述,

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

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

所以您有两个选择:

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.