Bokeh 资料源的更改不会被 push_notebook 实时更新
在本文中,我们将介绍 Bokeh 图表库中一个重要的特性,即在使用 push_notebook 函数时,对数据源进行的更改不会实时更新到图表中。我们将详细说明这个问题,并提供一些示例来说明。
阅读更多:Bokeh 教程
Bokeh 简介
Bokeh 是一个流行的 Python 图表库,用于创建交互式和美观的数据可视化。它支持多种图表类型,包括折线图、柱状图、散点图等,并提供了丰富的配置选项来定制图表的样式和交互功能。
push_notebook 函数的作用
在 Bokeh 中,push_notebook 函数用于将图表实时更新到 Jupyter Notebook 或 JupyterLab 中。通过调用 push_notebook 函数,可以在更改图表数据源后立即更新图表,而无需重新运行整个代码块。
数据源更改不会实时更新的问题
然而,我们在使用 Bokeh 创建图表的过程中可能会遇到一个问题,就是对数据源进行的更改不会实时更新到图表中。这意味着,即使我们通过 push_notebook 函数将图表输出到 Notebook 中,如果在此后更改了数据源,图表本身并不会自动更新。
为了说明这个问题,我们来看一个例子。假设我们运行以下代码:
from bokeh.plotting import figure, show
from bokeh.io import push_notebook
import numpy as np
# 创建一个折线图
p = figure(title="示例图表", x_axis_label="X轴", y_axis_label="Y轴")
r = p.line([], [], line_width=2)
# 将图表实时输出到 Notebook
handle = show(p, notebook_handle=True)
# 初始化数据
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
# 更新数据源
r.data_source.data = dict(x=x, y=y)
# 实时更新图表
push_notebook(handle=handle)
代码运行后,会在 Notebook 中显示出一个折线图。然而,如果我们随后更改了数据源中的 x 和 y 数组,图表并不会自动更新。例如,如果我们执行以下代码:
x = np.linspace(0, 10, 100)
y = np.sin(x)
即使我们对 x 和 y 数组进行了更改,由于数据源并未实时更新,图表仍然显示的是之前的数据。
解决方法
为了解决这个问题,我们可以通过重新调用 push_notebook 函数来手动更新图表。以下是相应的修改后的代码:
# 更新数据源
r.data_source.data = dict(x=x, y=y)
# 重新调用 push_notebook 函数更新图表
push_notebook(handle=handle)
这样,当我们更改数据源后,再次调用 push_notebook 函数将会更新图表,显示新的数据。
总结
在 Bokeh 图表库中,使用 push_notebook 函数可以将图表实时输出到 Jupyter Notebook 或 JupyterLab 中。然而,对数据源进行的更改并不会立即更新到图表中,需要手动调用 push_notebook 函数来进行更新。我们可以通过重新将数据源赋值给图形元素的 data_source 属性,并在此后重新调用 push_notebook 函数来实现图表的实时更新。