python - 无法使用 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)
谢谢!
解决方案
正如您在上面所做的那样,使用真正的 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”等的列,根本没有“年”列。
推荐阅读
- javascript - 如何获取用户输入,将其作为字符串传递给函数,并将函数结果呈现在屏幕上?
- html - 文本没有在 Div 中完全居中?
- php - 防止 PHP、PDO 和 MySQL/MariaDB 在不禁用 ATTR_EMULATE_PREPARES 的情况下将整数作为字符串返回
- kubernetes - 如何解决无法识别 kubernetes 中的“/home/circleci/patched_k8s.yml”错误?
- jupyter-notebook - 列出 jupyter 服务器上所有正在运行的笔记本
- google-cloud-platform - GCP - 自动部署具有 cron 作业的 AppEngine
- php - 如何从控制器访问视图中的变量值
- java - 如何使用杰克逊来解析 RFC3339 时间戳与可变数量的秒小数
- java - Java - 在未安装 SWT 的情况下运行依赖于 SWT 的程序
- android - 我可以在不打开邮件应用程序的情况下在 Android 和 IOS 中使用 IONIC 发送邮件吗?