Python Bokeh库详解:交互式数据可视化


概要

数据可视化在数据分析和科学研究中起着至关重要的作用。而Bokeh(发音为"bo-kay")是一个强大的Python交互式可视化库,提供了丰富的工具和功能,使得创建交互式、吸引人的数据可视化变得轻而易举。本文将深入介绍Bokeh库的各个方面,通过丰富的示例代码,帮助读者更全面地了解和使用这一强大的工具。


安装与基础绘图

首先,需要安装Bokeh库。通过以下命令即可完成安装:

pip install bokeh

安装完成后,可以开始学习Bokeh的基础绘图。

以下是一个简单的例子,绘制一条折线图:

from bokeh.plotting import figure, show

# 创建一个绘图对象
p = figure(title="简单折线图", x_axis_label="X轴", y_axis_label="Y轴")

# 添加折线
p.line([1, 2, 3, 4, 5], [6, 7, 2, 4, 3])

# 显示绘图
show(p)

数据源与图形配置

Bokeh支持多种数据源和丰富的图形配置选项。

以下是一个使用ColumnDataSource的例子,同时配置图形属性的示例:

from bokeh.models import ColumnDataSource

# 数据源
source = ColumnDataSource(data=dict(x=[1, 2, 3, 4, 5], y=[6, 7, 2, 4, 3]))

# 创建绘图对象
p = figure(title="数据源与图形配置", x_axis_label="X轴", y_axis_label="Y轴")

# 添加折线
p.line('x', 'y', source=source, line_width=2, line_color="green", legend_label="折线")

# 显示图形
show(p)

图形交互与工具

Bokeh的强大之处在于其交互性和丰富的工具集。

以下示例展示了如何添加轨迹选择工具、缩放工具等:

from bokeh.models import HoverTool

# 创建绘图对象
p = figure(title="图形交互与工具", x_axis_label="X轴", y_axis_label="Y轴", tools="pan,box_zoom,reset")

# 添加折线
p.line([1, 2, 3, 4, 5], [6, 7, 2, 4, 3], line_width=2, line_color="blue", legend_label="折线")

# 添加hover工具
hover = HoverTool()
hover.tooltips = [("数值", "@x, @y")]
p.add_tools(hover)

# 显示图形
show(p)

布局与多图绘制

Bokeh支持灵活的布局,可以轻松组合多个图形。

以下是一个简单的例子,展示了如何创建水平布局:

from bokeh.layouts import row

# 创建两个绘图对象
p1 = figure(title="图1", x_axis_label="X轴", y_axis_label="Y轴")
p2 = figure(title="图2", x_axis_label="X轴", y_axis_label="Y轴")

# 添加折线
p1.line([1, 2, 3, 4, 5], [6, 7, 2, 4, 3], line_width=2, line_color="red", legend_label="折线1")
p2.line([1, 2, 3, 4, 5], [3, 2, 7, 1, 6], line_width=2, line_color="green", legend_label="折线2")

# 将两个图形水平排列
layout = row(p1, p2)

# 显示布局
show(layout)

其他高级功能

Bokeh库不仅提供了基础的绘图功能,还支持许多高级功能,拓展了其应用领域。以下是一些Bokeh的高级功能:

1 绘制地理图

Bokeh可以轻松绘制地理图,展示数据在地图上的分布情况。通过使用TileSourcePatches,可以实现绘制各种地理形状,例如国家、州、城市等。

以下是一个简单的绘制世界地图的示例:

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

# 创建绘图对象
p = figure(title="世界地图", x_axis_label="经度", y_axis_label="纬度", plot_height=400, plot_width=800)

# 设置TileSource为OpenStreetMap
tile_source = get_provider('OSM')
p.add_tile(tile_source)

# 示例数据,表示两个城市的坐标
cities_data = dict(
    lon=[-74.0059, 139.6917],
    lat=[40.7128, 35.6895],
    name=['New York', 'Tokyo']
)

# 将数据转为ColumnDataSource
cities_source = ColumnDataSource(cities_data)

# 绘制城市点
p.circle(x='lon', y='lat', size=10, color='red', alpha=0.8, legend_label='Cities', source=cities_source)

# 显示地理图
show(p)

2 时间序列图

Bokeh支持绘制时间序列图,展示数据随时间的变化。通过设置X轴为时间类型,可以轻松绘制时间序列。

以下是一个简单的股票价格时间序列图的示例:

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

# 示例数据,表示股票价格随时间的变化
stock_data = dict(
    date=[datetime(2022, 1, 1), datetime(2022, 1, 2), datetime(2022, 1, 3)],
    price=[100, 120, 90]
)

# 将数据转为ColumnDataSource
stock_source = ColumnDataSource(stock_data)

# 创建绘图对象
p = figure(title="股票价格时间序列", x_axis_label="日期", y_axis_label="股价", x_axis_type="datetime")

# 绘制线条
p.line(x='date', y='price', line_width=2, line_color='blue', source=stock_source)

# 显示时间序列图
show(p)

3 网络图

Bokeh可以绘制网络图,展示节点和边之间的关系。通过使用NodesEdges,可以创建具有复杂结构的网络图。

以下是一个简单的网络图的示例:

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

# 示例数据,表示网络中的节点和边
network_data = dict(
    nodes=[1, 2, 3, 4],
    edges=[(1, 2), (2, 3), (3, 4), (4, 1)]
)

# 将数据转为ColumnDataSource
network_source = ColumnDataSource(network_data)

# 创建绘图对象
p = figure(title="网络图", x_axis_label="X轴", y_axis_label="Y轴")

# 绘制节点和边
p.circle('x', 'y', size=20, color='blue', source=network_source, legend_label='Nodes')
p.multi_line('edge_x', 'edge_y', line_width=2, line_color='green', source=network_source, legend_label='Edges')

# 添加节点和边的链接
p.add_layout(NodesAndLinkedEdges(node_source=network_source, edge_source=network_source))

# 显示网络图
show(p)

实时数据更新与动画

Bokeh还支持实时数据更新和动画效果,使得数据可视化更生动。

以下是一个简单的实时数据更新的示例:

from bokeh.models import ColumnDataSource
from bokeh.io import curdoc
import numpy as np
import time

# 数据源
source = ColumnDataSource(data=dict(x=[0], y=[0]))

# 创建绘图对象
p = figure(title="实时数据更新", x_axis_label="X轴", y_axis_label="Y轴")

# 添加实时数据点
p.circle('x', 'y', source=source, size=10, line_color="navy", fill_color="orange", alpha=0.6)

# 实时更新数据
def update_data():
    new_data = dict(x=[source.data['x'][-1] + 1], y=[np.random.randint(0, 10)])
    source.stream(new_data, rollover=20)
    time.sleep(0.5)  # 模拟实时更新

# 添加周期性回调,实现实时更新
curdoc().add_periodic_callback(update_data, 1000)

# 显示实时数据更新图形
show(p, notebook_handle=True)

导出与嵌入

Bokeh允许用户将绘图导出为HTML、PNG、SVG等格式,方便在不同环境中分享和展示。

以下是一个将绘图导出为HTML文件的例子:

from bokeh.io import output_file

# 创建绘图对象
p = figure(title="导出与嵌入", x_axis_label="X轴", y_axis_label="Y轴")
p.line([1, 2, 3, 4, 5], [6, 7, 2, 4, 3], line_width=2, line_color="purple", legend_label="折线")

# 导出为HTML文件
output_file("plot.html")

# 显示图形
show(p)

通过导出功能,用户可以将Bokeh图形轻松嵌入到网页中,与其他内容集成展示。

Bokeh Server

对于需要更高级交互性和动态更新的场景,Bokeh提供了Bokeh Server。

以下是一个简单的Bokeh Server示例:

from bokeh.server.server import Server
from bokeh.application import Application
from bokeh.application.handlers.function import FunctionHandler

def modify_doc(doc):
    # 在这里添加交互性和动态更新的代码
    pass

# 创建Bokeh Server应用
bokeh_app = Application(FunctionHandler(modify_doc))

# 启动Bokeh Server
server = Server({'/': bokeh_app}, port=5000)
server.start()

if __name__ == '__main__':
    print('Visit http://localhost:5006/ to view this app')
    server.io_loop.add_callback(server.show, "/")
    server.io_loop.start()

通过Bokeh Server,用户可以构建更复杂的交互式应用,实现更灵活的数据可视化。

总结

Bokeh库作为Python中的一款强大数据可视化工具,不仅提供了基础的绘图功能,还支持多种高级功能,拓展了其应用领域。本文深入介绍了Bokeh的基础绘图、数据源与图形配置、图形交互与工具、布局与多图绘制等基本功能,提供了全面的入门指南。此外,通过展示Bokeh在实时数据更新与动画、导出与嵌入、Bokeh Server以及其他高级功能方面的应用,可以深入了解Bokeh在复杂场景下的强大表现。

Bokeh的高级功能涵盖了绘制地理图、展示时间序列、绘制网络图等多个领域,使其不仅适用于常规数据可视化,也能满足特定领域的需求。例如,绘制世界地图可以展示数据在地理空间的分布,时间序列图可以清晰呈现数据随时间的变化趋势,而网络图则适用于展示节点和边之间的复杂关系。

总体而言,Bokeh以其简洁的语法、丰富的功能和强大的灵活性,成为数据科学和可视化领域的得力工具。通过本文的学习,能够更熟练地运用Bokeh库,创建出更具交互性和吸引力的数据可视化图形,提高数据分析和展示的效果。Bokeh的多样化功能使其成为解决不同可视化问题的理想选择,为用户提供了更丰富、更灵活的数据探索和展示手段。

相关推荐
Kisorge27 分钟前
【C语言】指针数组、数组指针、函数指针、指针函数、函数指针数组、回调函数
c语言·开发语言
轻口味2 小时前
命名空间与模块化概述
开发语言·前端·javascript
晓纪同学2 小时前
QT-简单视觉框架代码
开发语言·qt
威桑2 小时前
Qt SizePolicy详解:minimum 与 minimumExpanding 的区别
开发语言·qt·扩张策略
飞飞-躺着更舒服2 小时前
【QT】实现电子飞行显示器(简易版)
开发语言·qt
明月看潮生3 小时前
青少年编程与数学 02-004 Go语言Web编程 16课题、并发编程
开发语言·青少年编程·并发编程·编程与数学·goweb
明月看潮生3 小时前
青少年编程与数学 02-004 Go语言Web编程 17课题、静态文件
开发语言·青少年编程·编程与数学·goweb
Java Fans3 小时前
C# 中串口读取问题及解决方案
开发语言·c#
盛派网络小助手3 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#
算法小白(真小白)3 小时前
低代码软件搭建自学第二天——构建拖拽功能
python·低代码·pyqt