Bokeh:使用Python进行交互式数据可视化的综合指南

引言

数据可视化是数据分析和故事讲述中不可或缺的一部分,它能够将复杂的数据以清晰且有洞察力的方式呈现出来。虽然有许多工具可以用来创建可视化图表,但 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)

示例解析

  1. 数据准备

    • 使用 numpy 生成 x 轴的 100 个等间距数据点。
    • 计算每个 x 对应的正弦值 (y) 和余弦值 (y2)。
  2. ColumnDataSource

    • 使用 ColumnDataSource 管理数据源,使得数据与图表之间可以动态联动。
  3. 工具栏

    • figure 对象中定义了多个工具(如 panwheel_zoombox_zoomresetsave),用户可以与图表交互。
  4. HoverTool

    • 悬停工具可以显示鼠标悬停在某个数据点时的详细信息。
  5. 显示图表

    • 使用 show() 函数来显示图表。

结果

运行此代码后,将生成一个名为 interactive_line_plot.html 的文件,打开该文件即可查看生成的交互式折线图。你可以使用鼠标在图表中缩放、平移,以及查看每个数据点的具体数值。


这些示例展示了 Bokeh 的多种功能,从简单图表到交互式绘图,再到高级的可视化工具。通过这些例子,你可以根据自己的需求选择并扩展这些图表,以便更好地展示和理解数据。

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值