这是我第一次在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回调需要将代码作为应用程序在Bokeh服务器上运行。这是因为Web浏览器不了解Python代码,也不具有运行Python代码的能力。真正的Python回调意味着有一些实际运行的Python进程可以运行Python回调代码。在这种情况下,该进程就是Bokeh服务器(即Bokeh服务器exists to be)。
现在,show
函数用于生成standalone(即非Bokeh服务器)输出。静态文件中只有纯HTML和JS。鉴于此,真正的Python回调无法与show
一起使用。
所以您有两个选择:
Select
更新数据。CustomJS
回调,而不使用Python回调。绝对可能仅使用JS回调即可执行这种操作,在这种情况下,使用show
创建的独立输出将起作用。有关背景以及从小部件上的JS回调更新内容的许多示例,请参见JavaScript Callbacks。 此外,还有其他一些其他问题。即,此行:
chart.line('year', 'score', ...)
tell Bokeh “在数据源中查找名为'year'的列作为x值,在名为'score'的列中查找y-值”。但是,您的数据源没有这些列。它具有名为“ score_AJ”等名称的列,根本没有“ year”列。