初步 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 DataFrame
、MultiIndex
和 GroupBy
数据的信息。
Polars、PyArrow 以及 Narwhals 支持的任何其他 eager dataframe 也可以传递给 ColumnDataSource。
过滤数据#
Bokeh 带有各种过滤方法。如果您想创建 ColumnDataSource 中包含的数据的特定子集,请使用这些过滤器。
在 Bokeh 中,这些过滤后的子集称为“视图”。视图由 Bokeh 的 CDSView
类表示。
要使用过滤后的数据子集进行绘图,请将 CDSView
对象传递给渲染器的 view
参数。
CDSView
对象具有一个属性
filter
:Filter
模型的实例
最简单的过滤器是 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]]))