第一步 8:提供和过滤数据#
在 上一步步指南 中,您使用了不同的方法来显示和导出您的可视化效果。
在本节中,您将使用各种来源和结构来导入和过滤数据。
使用 ColumnDataSource#
The ColumnDataSource
是 Bokeh 自己的数据结构。有关 ColumnDataSource
的详细信息,请参见用户指南中的 ColumnDataSource。
到目前为止,您一直使用 Python 列表和 NumPy 数组等数据序列将数据传递给 Bokeh。Bokeh 会自动将这些列表转换为 ColumnDataSource
对象,供您使用。
请按照以下步骤直接创建一个 ColumnDataSource
首先,导入
ColumnDataSource
。接下来,创建一个包含您数据的字典:字典的键是列名(字符串)。字典的值是数据列表或数组。
然后,将您的字典作为
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。这包括有关使用 pandas DataFrame
、MultiIndex
和 GroupBy
数据的信息。
过滤数据#
Bokeh 带有各种过滤方法。如果您想创建 ColumnDataSource 中包含数据的特定子集,请使用这些过滤器。
在 Bokeh 中,这些过滤后的子集称为“视图”。视图由 Bokeh 的 CDSView
类表示。
要使用过滤后的数据子集进行绘图,请将 CDSView
对象传递给渲染器的 view
参数。
A 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]]))