引言
数据可视化是数据分析和故事讲述中不可或缺的一部分,它能够将复杂的数据以清晰且有洞察力的方式呈现出来。虽然有许多工具可以用来创建可视化图表,但 Bokeh 因其能够轻松创建交互式和适用于网络的图表而脱颖而出。本文深入探讨 Bokeh 的基础知识,介绍它的关键功能,并通过实际示例帮助你快速入门。
Bokeh 简介
Bokeh 是一个 Python 库,专注于生成高度交互的可视化图表。与其他静态图表库不同,Bokeh 能够将图表嵌入到网页中,并允许用户与数据进行交互,比如缩放、平移、悬停显示详细信息等。这使得 Bokeh 成为数据分析师、科学家和开发者的理想工具,特别是在构建需要展示和探索大数据集的应用时。
安装与基础使用
在开始使用 Bokeh 之前,你需要安装该库。可以通过以下命令进行安装:
pip install bokeh
安装完成后,你可以开始创建简单的图表。以下是一个简单的折线图示例:
from bokeh.plotting import figure, show, output_file
# 创建输出文件
output_file("simple_line.html")
# 创建图表对象
p = figure(title="简单折线图示例", x_axis_label='X 轴', y_axis_label='Y 轴')
# 添加折线图
p.line([1, 2, 3, 4, 5], [6, 7, 2, 4, 5], legend_label="样本数据", line_width=2)
# 显示图表
show(p)
在这个例子中,我们创建了一个简单的折线图,并将其输出到一个 HTML 文件中。你可以直接在浏览器中打开该文件,查看图表。
创建交互式图表
Bokeh 的强大之处在于它的交互功能。你可以轻松地为图表添加工具栏,允许用户进行缩放、平移和选择数据。例如:
from bokeh.plotting import figure, show
from bokeh.models import HoverTool
# 创建图表对象
p = figure(title="带悬停工具的散点图", tools="pan,box_zoom,reset")
# 添加散点图
p.scatter([1, 2, 3, 4, 5], [6, 7, 2, 4, 5], size=10, color="navy", alpha=0.5)
# 添加悬停工具
hover = HoverTool()
hover.tooltips = [("x", "$x"), ("y", "$y")]
p.add_tools(hover)
# 显示图表
show(p)
在这个示例中,我们创建了一个带有悬停工具的散点图,当你将鼠标悬停在数据点上时,可以查看到具体的 x 和 y 坐标值。
高级图表:堆叠柱状图
Bokeh 也可以创建复杂的图表,如堆叠柱状图。以下是一个示例代码:
from bokeh.plotting import figure, show, output_file
from bokeh.models import ColumnDataSource
from bokeh.palettes import Spectral3
# 创建输出文件
output_file("stacked_bar_chart.html")
# 准备数据
fruits = ['Apples', 'Bananas', 'Pears', 'Grapes', 'Oranges']
years = ['2015', '2016', '2017']
data = {'fruits': fruits,
'2015': [2, 1, 4, 3, 2],
'2016': [5, 3, 3, 2, 4],
'2017': [3, 2, 4, 4, 5]}
# 使用 ColumnDataSource 转换数据
source = ColumnDataSource(data=data)
# 设置绘图参数
p = figure(x_range=fruits, height=350, title="按年堆叠的柱状图",
toolbar_location=None, tools="")
# 添加堆叠柱状图
p.vbar_stack(years, x='fruits', width=0.9, color=Spectral3, source=source,
legend_label=years)
p.y_range.start = 0
p.xgrid.grid_line_color = None
p.axis.minor_tick_line_color = None
p.outline_line_color = None
p.legend.location = "top_left"
p.legend.orientation = "horizontal"
# 显示图表
show(p)
这个堆叠柱状图展示了不同年份的水果销量。通过这种图表,可以更直观地比较不同类别的数据分布情况。
总结
Bokeh 是一个功能强大且灵活的可视化库,它让你能够轻松地创建交互式图表并将其嵌入到网页中。无论是简单的静态图表,还是复杂的交互式可视化,Bokeh 都能胜任。通过本文的介绍和示例代码,你应该能够开始使用 Bokeh 构建属于你自己的数据可视化项目。
接下来的步骤
如果你对 Bokeh 感兴趣,可以进一步探索 Bokeh 的文档和更多高级功能,比如图表之间的联动、不同布局的组合以及如何与其他数据分析工具集成。通过不断实践,你会发现 Bokeh 是一个非常强大的工具,能够帮助你在数据科学和数据分析领域取得更大的成果。
下面是几个使用 Bokeh
进行数据可视化的示例。这些例子展示了如何创建不同类型的图表,包括折线图、柱状图、散点图和交互式小部件。
1. 简单折线图
from bokeh.plotting import figure, show, output_file
# 创建输出文件
output_file("simple_line.html")
# 准备数据
x = [1, 2, 3, 4, 5]
y = [6, 7, 2, 4, 5]
# 创建绘图对象
p = figure(title="Simple Line Plot", x_axis_label='X-Axis', y_axis_label='Y-Axis')
# 添加折线
p.line(x, y, legend_label="Line", line_width=2)
# 显示图表
show(p)
这个示例展示了如何创建一个简单的折线图,并保存为 simple_line.html
文件。在浏览器中打开该文件即可查看图表。
2. 柱状图
from bokeh.plotting import figure, show, output_file
# 创建输出文件
output_file("bar_chart.html")
# 准备数据
categories = ['Category A', 'Category B', 'Category C', 'Category D']
values = [3, 7, 8, 5]
# 创建绘图对象
p = figure(x_range=categories, title="Simple Bar Chart", x_axis_label='Categories', y_axis_label='Values')
# 添加柱状图
p.vbar(x=categories, top=values, width=0.5, color="navy", legend_label="Value")
# 显示图表
show(p)
这个示例展示了如何创建一个简单的柱状图,每个类别对应一个数值。x_range
用于指定 x 轴上的分类标签。
3. 散点图
from bokeh.plotting import figure, show, output_file
from bokeh.models import HoverTool
# 创建输出文件
output_file("scatter_plot.html")
# 准备数据
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [6, 7, 2, 4, 5, 7, 8, 9, 3, 6]
sizes = [15, 20, 25, 30, 35, 40, 45, 50, 55, 60]
# 创建绘图对象
p = figure(title="Scatter Plot with Sizes", x_axis_label='X-Axis', y_axis_label='Y-Axis')
# 添加散点图
p.scatter(x, y, size=sizes, fill_color="green", legend_label="Data Points")
# 添加 HoverTool 工具
hover = HoverTool()
hover.tooltips = [("X", "$x"), ("Y", "$y"), ("Size", "@sizes")]
p.add_tools(hover)
# 显示图表
show(p)
这个示例展示了如何创建一个带有不同大小点的散点图,并添加 HoverTool
工具,以便在悬停时查看点的详细信息。
4. 带滑动条的交互式图表
from bokeh.plotting import figure, show, output_file
from bokeh.layouts import column
from bokeh.models import Slider, ColumnDataSource
from bokeh.io import curdoc
# 创建输出文件
output_file("interactive_plot.html")
# 准备数据
x = list(range(1, 11))
y = [i**2 for i in x]
# 创建数据源
source = ColumnDataSource(data=dict(x=x, y=y))
# 创建绘图对象
p = figure(title="Interactive Plot with Slider", x_axis_label='X-Axis', y_axis_label='Y-Axis')
# 添加线条和圆点
p.line('x', 'y', source=source, line_width=2)
p.circle('x', 'y', size=10, source=source)
# 创建滑动条
slider = Slider(start=1, end=10, value=1, step=1, title="Multiplier")
# 定义滑动条回调函数
def update(attr, old, new):
factor = slider.value
new_y = [i**factor for i in x]
source.data = dict(x=x, y=new_y)
slider.on_change('value', update)
# 布局并展示
layout = column(p, slider)
curdoc().add_root(layout)
show(layout)
这个示例展示了一个带滑动条的交互式图表。滑动条控制 y
值的乘方,每次滑动滑动条时,图表将根据滑动条的值进行更新。
5. 带分类变量的堆叠柱状图
from bokeh.plotting import figure, show, output_file
from bokeh.models import ColumnDataSource, HoverTool
from bokeh.palettes import Spectral3
# 创建输出文件
output_file("stacked_bar_chart_with_hover.html")
# 准备数据
fruits = ['Apples', 'Bananas', 'Pears', 'Grapes', 'Oranges']
years = ['2015', '2016', '2017']
data = {'fruits': fruits,
'2015': [2, 1, 4, 3, 2],
'2016': [5, 3, 3, 2, 4],
'2017': [3, 2, 4, 4, 5]}
# 使用 ColumnDataSource 转换数据
source = ColumnDataSource(data=data)
# 设置绘图参数
p = figure(x_range=fruits, height=350, title="按年堆叠的柱状图",
toolbar_location=None, tools="")
# 添加堆叠柱状图
p.vbar_stack(years, x='fruits', width=0.9, color=Spectral3, source=source,
legend_label=years)
# 添加悬停工具
hover = HoverTool()
hover.tooltips = [
("水果", "@fruits"),
("2015", "@2015"),
("2016", "@2016"),
("2017", "@2017")
]
p.add_tools(hover)
# 设置图表参数
p.y_range.start = 0
p.xgrid.grid_line_color = None
p.axis.minor_tick_line_color = None
p.outline_line_color = None
p.legend.location = "top_left"
p.legend.orientation = "horizontal"
# 显示图表
show(p)
这个示例展示了如何创建一个堆叠柱状图,其中每个柱表示不同年份的水果数量。不同颜色表示不同年份的数据。
以下是一个重新编写的使用 Bokeh 创建交互式绘图的示例,展示了一个交互式的折线图。用户可以通过工具栏中的各种工具与图表进行交互,包括缩放、平移和悬停查看数据点的信息。
6. 交互式折线图示例
from bokeh.plotting import figure, show, output_file
from bokeh.models import HoverTool, ColumnDataSource
import numpy as np
# 创建输出文件
output_file("interactive_line_plot.html")
# 准备数据
x = np.linspace(0, 10, 100) # 生成从0到10的100个等间距的数据点
y = np.sin(x) # 计算每个x数据点对应的y值
y2 = np.cos(x) # 计算每个x数据点对应的另一个y值
# 将数据打包成ColumnDataSource对象
source = ColumnDataSource(data=dict(x=x, y=y, y2=y2))
# 创建图表对象
p = figure(title="交互式折线图", tools="pan,wheel_zoom,box_zoom,reset,save",
x_axis_label='X 轴', y_axis_label='Y 轴', width=800, height=400)
# 添加第一条折线
p.line('x', 'y', source=source, legend_label="sin(x)", line_width=2, color="blue")
# 添加第二条折线
p.line('x', 'y2', source=source, legend_label="cos(x)", line_width=2, color="green")
# 添加悬停工具
hover = HoverTool()
hover.tooltips = [("X 值", "@x"), ("Y 值", "@y"), ("Y2 值", "@y2")]
p.add_tools(hover)
# 显示图表
show(p)
示例解析
-
数据准备:
- 使用
numpy
生成 x 轴的 100 个等间距数据点。 - 计算每个 x 对应的正弦值 (
y
) 和余弦值 (y2
)。
- 使用
-
ColumnDataSource:
- 使用
ColumnDataSource
管理数据源,使得数据与图表之间可以动态联动。
- 使用
-
工具栏:
- 在
figure
对象中定义了多个工具(如pan
、wheel_zoom
、box_zoom
、reset
和save
),用户可以与图表交互。
- 在
-
HoverTool:
- 悬停工具可以显示鼠标悬停在某个数据点时的详细信息。
-
显示图表:
- 使用
show()
函数来显示图表。
- 使用
结果
运行此代码后,将生成一个名为 interactive_line_plot.html
的文件,打开该文件即可查看生成的交互式折线图。你可以使用鼠标在图表中缩放、平移,以及查看每个数据点的具体数值。
这些示例展示了 Bokeh
的多种功能,从简单图表到交互式绘图,再到高级的可视化工具。通过这些例子,你可以根据自己的需求选择并扩展这些图表,以便更好地展示和理解数据。