Bokeh共享两个回调之间的变量
在本文中,我们将介绍如何在Bokeh应用程序中共享变量,以便在两个回调之间进行数据交互和更新。
Bokeh是一个交互式数据可视化库,用于创建漂亮而具有交互性的图表和应用程序。在Bokeh中,我们可以创建各种图表和交互控件,并为它们添加回调函数以响应用户输入或其他事件。Bokeh应用程序通常由一个或多个回调函数组成,这些函数负责处理用户输入、更新数据和重新绘制图表。
阅读更多:Bokeh 教程
共享变量
在Bokeh应用程序中,我们可能需要在回调函数之间共享数据。这可以通过将变量定义为应用程序的属性或全局变量来实现。我们可以使用curdoc().add_root
方法将这些变量附加到应用程序的根部,并在不同的回调函数中使用它们。
让我们以一个简单的例子来说明如何共享变量。考虑一个Bokeh应用程序,其中包含一个滑块和一个文本输入框。滑块控制文本框中的文本大小。我们可以通过共享一个font_size
变量来实现这一目标。
from bokeh.layouts import column
from bokeh.models import Slider, TextInput
from bokeh.plotting import curdoc
font_size = 16
slider = Slider(title="文本大小", value=font_size, start=10, end=30, step=1)
text_input = TextInput(value="Hello, World!", title="文本")
def update_font_size(attr, old, new):
global font_size
font_size = slider.value
text_input.value = text_input.value
slider.on_change("value", update_font_size)
curdoc().add_root(column(slider, text_input))
在上面的例子中,我们定义了一个font_size
变量,并将其初始化为16。滑块控件的值绑定到font_size
变量,并使用on_change
方法注册一个回调函数来更新font_size
变量。
在回调函数update_font_size
中,我们使用global
关键字来表明我们想要更新外部font_size
变量的值。我们还将文本框的值设置为其当前值,以确保文本框的值保持不变。
请注意,我们在最后一行使用curdoc().add_root
方法将滑块和文本框添加到应用程序的根部。这样做可以确保这些控件在应用程序中可见,并且可以与用户进行交互。
共享数据
除了共享变量外,Bokeh还提供了一种将数据在回调函数之间共享的机制。我们可以使用ColumnDataSource
对象来存储和共享数据。ColumnDataSource
是一个类似于字典的数据结构,它允许我们将多个列的数据存储在一个对象中,并以列名作为键访问数据。
让我们再次看一个例子,演示如何在两个回调函数间共享数据。考虑一个Bokeh应用程序,其中包含一个滑块和一个图表。滑块控制图表中的数据范围。我们可以使用ColumnDataSource
对象来存储和更新数据。
import numpy as np
from bokeh.layouts import column
from bokeh.models import Slider
from bokeh.plotting import curdoc, figure
from bokeh.transform import linear_cmap
from bokeh.palettes import Viridis256
from bokeh.models import ColumnDataSource
x = np.linspace(0, 10, 100)
y = np.sin(x)
source = ColumnDataSource(data=dict(x=x, y=y))
slider = Slider(title="数据范围", value=10, start=1, end=20, step=1)
def update_data(attr, old, new):
x = np.linspace(0, slider.value, 100)
y = np.sin(x)
source.data = dict(x=x, y=y)
slider.on_change("value", update_data)
p = figure(plot_width=400, plot_height=400)
p.line(source=source, x='x', y='y', line_color=linear_cmap('x', Viridis256, min(x), max(x)))
curdoc().add_root(column(slider, p))
在上述例子中,我们使用numpy
模块生成一些样本数据。然后,我们使用ColumnDataSource
对象将x
和y
数据存储在一个对象中。滑块的值绑定到update_data
函数,该函数根据滑块值更新x
和y
数据,并通过source.data
属性更新ColumnDataSource
对象中的数据。
最后,我们使用bokeh.plotting
模块创建一个图表,并使用source
参数指定ColumnDataSource
对象为图表提供数据。这将确保图表在数据更新时自动更新。
总结
本文介绍了如何在Bokeh应用程序中共享变量和数据,以便在两个回调函数之间实现数据交互和更新。通过将变量或ColumnDataSource
对象定义为应用程序的属性或全局变量,我们可以在不同的回调函数中访问和修改数据。这使得我们可以创建具有复杂交互性的Bokeh应用程序,以满足不同的数据可视化需求。
需要注意的是,在实际开发中,我们应该根据具体的应用场景和需求来选择合适的数据共享方式,以确保代码的可读性和可维护性。