初步 8: 提供和过滤数据#

之前的初步指南中,您使用了不同的方法来显示和导出您的可视化。

在本节中,您将使用各种来源和结构来导入和过滤数据。

使用 ColumnDataSource#

ColumnDataSource是 Bokeh 自己的数据结构。有关 ColumnDataSource 的详细信息,请参阅用户指南中的ColumnDataSource

到目前为止,您已经使用过诸如 Python 列表和 NumPy 数组之类的数据序列来将数据传递给 Bokeh。Bokeh 已经自动将这些列表转换为 ColumnDataSource 对象。

按照以下步骤直接创建 ColumnDataSource

  • 首先,导入 ColumnDataSource

  • 接下来,创建一个包含您的数据的 dict:dict 的键是列名(字符串)。dict 的值是数据列表或数组。

  • 然后,将您的 dict 作为 data 参数传递给 ColumnDataSource

  • 然后,您可以将您的 ColumnDataSource 用作渲染器的 source

from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource

# create dict as basis for ColumnDataSource
data = {'x_values': [1, 2, 3, 4, 5],
        'y_values': [6, 7, 2, 3, 6]}

# create ColumnDataSource based on dict
source = ColumnDataSource(data=data)

# create a plot and renderer with ColumnDataSource data
p = figure(height=250)
p.scatter(x='x_values', y='y_values', size=20, source=source)
show(p)

另请参阅

有关 Bokeh 的 ColumnDataSource 的更多信息,请参阅用户指南中的ColumnDataSource和参考指南中的ColumnDataSource

有关向 ColumnDataSource 添加数据的信息,请参阅向 ColumnDataSource 追加数据。有关替换 ColumnDataSource 数据的信息,请访问用户指南中的替换 ColumnDataSource 中的数据

有关使用 Python 列表的更多信息,请参阅使用 Python 列表提供数据。有关将 NumPy 数据与 Bokeh 一起使用的更多信息,请参阅提供 NumPy 数据

转换 pandas 数据#

要使用来自 pandas DataFrame 的数据,请将您的 pandas 数据传递给 ColumnDataSource

source = ColumnDataSource(df)

另请参阅

有关在 Bokeh 中使用 pandas 数据的更多信息,请参阅用户指南中的使用数据帧。这包括有关使用 pandas DataFrameMultiIndexGroupBy 数据的信息。

Polars、PyArrow 以及 Narwhals 支持的任何其他 eager dataframe 也可以传递给 ColumnDataSource。

过滤数据#

Bokeh 带有各种过滤方法。如果您想创建 ColumnDataSource 中包含的数据的特定子集,请使用这些过滤器。

在 Bokeh 中,这些过滤后的子集称为“视图”。视图由 Bokeh 的 CDSView 类表示。

要使用过滤后的数据子集进行绘图,请将 CDSView 对象传递给渲染器的 view 参数。

CDSView 对象具有一个属性

  • filterFilter 模型的实例

最简单的过滤器是 IndexFilter。IndexFilter 使用索引位置列表,并创建一个仅包含位于这些索引位置的数据点的视图。

例如,如果您的 ColumnDataSource 包含五个值的列表,并且您应用一个带有 [0,2,4] 的 IndexFilter,则生成的 view 仅包含原始列表的第一个、第三个和第五个值

from bokeh.layouts import gridplot
from bokeh.models import CDSView, ColumnDataSource, IndexFilter
from bokeh.plotting import figure, show

# create ColumnDataSource from a dict
source = ColumnDataSource(data=dict(x=[1, 2, 3, 4, 5], y=[1, 2, 3, 4, 5]))

# create a view using an IndexFilter with the index positions [0, 2, 4]
view = CDSView(filter=IndexFilter([0, 2, 4]))

# setup tools
tools = ["box_select", "hover", "reset"]

# create a first plot with all data in the ColumnDataSource
p = figure(height=300, width=300, tools=tools)
p.scatter(x="x", y="y", size=10, hover_color="red", source=source)

# create a second plot with a subset of ColumnDataSource, based on view
p_filtered = figure(height=300, width=300, tools=tools)
p_filtered.scatter(x="x", y="y", size=10, hover_color="red", source=source, view=view)

# show both plots next to each other in a gridplot layout
show(gridplot([[p, p_filtered]]))

另请参阅

有关 Bokeh 中各种过滤器的更多信息,请参阅用户指南中的过滤数据。参考指南中的CDSViewFilter条目中也提供了更多信息。