探索 Bokeh:轻松创建交互式数据可视化的强大工具
探索 Bokeh:轻松创建交互式数据可视化的强大工具
在数据科学和数据分析领域,交互式数据可视化是一项不可或缺的技能。Bokeh 是一个强大的 Python 库,它可以帮助我们快速构建高质量的交互式图表和仪表盘,同时兼具高性能和灵活性。本文将带您了解 Bokeh 的核心功能,并通过实际示例展示它的应用。
什么是 Bokeh?
Bokeh 是一个用于创建交互式、Web 优化数据可视化的 Python 库。它的核心特点包括:
- 交互性:用户可以通过缩放、平移、悬停工具动态探索图表。
- 易集成:支持嵌入 HTML 页面或 Jupyter Notebook。
- 多功能性:提供从简单图表到复杂仪表盘的构建能力。
- 高性能:适合处理大规模数据。
安装和入门
在开始使用 Bokeh 前,请先确保已安装库:
pip install bokeh
接下来,我们通过简单示例体验 Bokeh 的基本功能。
创建一个简单的折线图
以下代码展示了如何使用 Bokeh 创建一个交互式折线图:
from bokeh.plotting import figure, show
from bokeh.io import output_notebook# 在 Jupyter Notebook 中显示输出
output_notebook()# 数据
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)
运行代码后,您将看到一个可以交互的折线图。通过工具栏,您可以缩放、平移并悬停查看详细数据。
使用 Pandas 数据快速绘图
Bokeh 与 Pandas 集成得很好,您可以直接将 Pandas DataFrame 作为数据源来绘图。例如:
import pandas as pd
from bokeh.plotting import figure, show# 创建示例 DataFrame
data = {"Month": ["Jan", "Feb", "Mar", "Apr", "May"],"Sales": [100, 200, 150, 300, 400]
}
df = pd.DataFrame(data)# 创建柱状图
p = figure(x_range=df["Month"], title="Monthly Sales", x_axis_label="Month", y_axis_label="Sales")# 添加柱状图
p.vbar(x=df["Month"], top=df["Sales"], width=0.5, color="blue")# 显示图表
show(p)
这段代码生成了一个按月份显示销售额的柱状图,直观展现了数据变化。
添加交互工具
Bokeh 的强大之处在于它的交互工具。以下示例展示了如何添加悬停提示和缩放功能:
from bokeh.models import HoverTool# 创建图形对象
p = figure(title="Interactive Plot", x_axis_label="X", y_axis_label="Y", tools="pan,box_zoom,reset")# 添加数据
p.circle(x, y, size=10, color="navy", alpha=0.5, legend_label="Data Points")# 添加悬停工具
hover = HoverTool()
hover.tooltips = [("X Value", "@x"), ("Y Value", "@y")]
p.add_tools(hover)# 显示图表
show(p)
通过悬停,您可以动态查看每个数据点的详细信息。
构建多子图布局
Bokeh 提供了 gridplot
来构建多图布局,这在创建仪表盘时非常有用。例如:
from bokeh.layouts import gridplot# 创建多个图表
p1 = figure(title="Line Plot")
p1.line(x, y, color="blue", legend_label="Line")p2 = figure(title="Scatter Plot")
p2.scatter(x, y, size=10, color="green", legend_label="Points")# 使用 gridplot 布局
layout = gridplot([[p1, p2]])
show(layout)
运行代码后,您将看到两个图表并排显示。
动态数据更新
Bokeh 允许实时更新图表,适合处理动态数据。例如,绘制一个实时更新的折线图:
from bokeh.plotting import curdoc
from bokeh.models import ColumnDataSource
from bokeh.layouts import column
from bokeh.plotting import figure
import random# 数据源
source = ColumnDataSource(data=dict(x=[], y=[]))# 创建图表
p = figure(title="Real-Time Plot", x_axis_label="Time", y_axis_label="Value")
p.line('x', 'y', source=source)# 更新数据的回调函数
def update():new_data = dict(x=[source.data['x'][-1] + 1 if source.data['x'] else 0], y=[random.randint(0, 10)])source.stream(new_data, rollover=50)# 每秒更新一次数据
curdoc().add_periodic_callback(update, 1000)# 显示布局
curdoc().add_root(column(p))
在运行这段代码时,图表会自动更新,显示实时生成的数据。
构建交互式仪表盘
以下代码展示了如何创建一个交互式仪表盘,包含下拉菜单和滑块控件:
from bokeh.models import Select, Slider
from bokeh.layouts import row, column# 创建图表
p = figure(title="Interactive Dashboard")
line = p.line(x, y, legend_label="Line", line_width=2)# 创建交互控件
select = Select(title="Line Color", value="blue", options=["blue", "green", "red"])
slider = Slider(title="Line Width", value=2, start=1, end=10, step=1)# 控件回调函数
def update(attr, old, new):line.glyph.line_color = select.valueline.glyph.line_width = slider.value# 将控件与回调关联
select.on_change("value", update)
slider.on_change("value", update)# 布局
layout = column(row(select, slider), p)
curdoc().add_root(layout)
运行代码后,您可以通过下拉菜单和滑块动态更改折线的颜色和宽度。
基础总结
Bokeh 是一个功能丰富且灵活的交互式可视化工具,非常适合快速开发 Web 优化的可视化应用。通过 Bokeh,您可以轻松完成以下任务:
- 生成各种交互式图表。
- 构建多视图仪表盘。
- 实现实时数据更新。
Bokeh 实战:从数据分析到交互式仪表盘开发
在本节中,我们将通过一个完整的实战项目,展示如何用 Bokeh 构建一个交互式仪表盘,实时可视化和分析销售数据。
实战场景
假设我们有一个电商平台的销售数据集,其中包含以下字段:
- 订单日期(
Order Date
):订单的日期。 - 销售额(
Sales
):订单金额。 - 类别(
Category
):商品类别,如 “Electronics”、“Clothing” 等。 - 地区(
Region
):订单所属地区。
目标是通过 Bokeh 构建一个交互式仪表盘,完成以下功能:
- 按时间查看销售趋势。
- 对比不同商品类别的销售额占比。
- 显示各地区销售分布。
- 通过滑块和下拉菜单动态过滤数据。
数据准备
首先,我们模拟一个数据集:
import pandas as pd
import numpy as np# 生成示例数据
np.random.seed(42)
dates = pd.date_range(start="2023-01-01", end="2023-12-31", freq="D")
data = {"Order Date": np.random.choice(dates, 1000),"Sales": np.random.randint(100, 2000, 1000),"Category": np.random.choice(["Electronics", "Clothing", "Home Appliances"], 1000),"Region": np.random.choice(["North", "South", "East", "West"], 1000)
}
df = pd.DataFrame(data)# 转换日期格式
df['Order Date'] = pd.to_datetime(df['Order Date'])
df['Month'] = df['Order Date'].dt.to_period('M').astype(str) # 生成月度字段
构建图表
1. 月销售趋势图
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource# 数据聚合
monthly_sales = df.groupby("Month")["Sales"].sum().reset_index()
monthly_sales_source = ColumnDataSource(monthly_sales)# 绘制折线图
trend_plot = figure(title="Monthly Sales Trend",x_range=monthly_sales["Month"],x_axis_label="Month",y_axis_label="Total Sales",tools="pan,box_zoom,reset,hover"
)
trend_plot.line(x="Month",y="Sales",source=monthly_sales_source,line_width=2,color="blue",legend_label="Monthly Sales"
)
trend_plot.legend.location = "top_left"
2. 商品类别销售额占比图
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure# 数据聚合
category_sales = df.groupby("Category")["Sales"].sum().reset_index()
category_source = ColumnDataSource(category_sales)# 绘制饼图
from math import pi
from bokeh.transform import cumsum
from bokeh.palettes import Category20ccategory_sales["angle"] = category_sales["Sales"] / category_sales["Sales"].sum() * 2 * pi
category_sales["color"] = Category20c[len(category_sales)]category_pie_plot = figure(title="Sales by Category",tools="hover",tooltips="@Category: @Sales",x_range=(-0.5, 1.0)
)
category_pie_plot.wedge(x=0,y=1,radius=0.4,start_angle=cumsum("angle", include_zero=True),end_angle=cumsum("angle"),line_color="white",fill_color="color",legend_field="Category",source=ColumnDataSource(category_sales)
)
category_pie_plot.axis.visible = False
category_pie_plot.grid.visible = False
3. 地区销售分布柱状图
# 数据聚合
region_sales = df.groupby("Region")["Sales"].sum().reset_index()
region_source = ColumnDataSource(region_sales)# 绘制柱状图
region_bar_plot = figure(title="Sales by Region",x_range=region_sales["Region"],x_axis_label="Region",y_axis_label="Total Sales",tools="pan,box_zoom,reset"
)
region_bar_plot.vbar(x="Region",top="Sales",width=0.5,color="blue",source=region_source
)
添加交互控件
1. 滑块控件:按销售额过滤
from bokeh.models import Slider# 创建滑块
sales_slider = Slider(title="Minimum Sales Filter",start=100,end=2000,value=100,step=100
)# 滑块回调函数
def update_data(attr, old, new):filtered_data = df[df["Sales"] >= sales_slider.value]updated_monthly_sales = filtered_data.groupby("Month")["Sales"].sum().reset_index()monthly_sales_source.data = updated_monthly_salesupdated_region_sales = filtered_data.groupby("Region")["Sales"].sum().reset_index()region_source.data = updated_region_salessales_slider.on_change("value", update_data)
2. 下拉菜单:按类别过滤
from bokeh.models import Select# 创建下拉菜单
category_select = Select(title="Select Category",value="All",options=["All"] + list(df["Category"].unique())
)# 下拉菜单回调函数
def filter_category(attr, old, new):filtered_data = df[df["Category"] == category_select.value] if category_select.value != "All" else dfupdated_monthly_sales = filtered_data.groupby("Month")["Sales"].sum().reset_index()monthly_sales_source.data = updated_monthly_salesupdated_region_sales = filtered_data.groupby("Region")["Sales"].sum().reset_index()region_source.data = updated_region_salescategory_select.on_change("value", filter_category)
构建仪表盘布局
利用 Bokeh 的 layout
布局工具,将图表和控件组合在一起:
from bokeh.layouts import column, row
from bokeh.io import curdoc# 布局
dashboard = column(row(category_select, sales_slider),trend_plot,row(category_pie_plot, region_bar_plot)
)# 添加到文档
curdoc().add_root(dashboard)
curdoc().title = "Sales Dashboard"
启动 Bokeh 服务
将上述代码保存为 dashboard.py
文件,然后在终端运行以下命令:
bokeh serve --show dashboard.py
浏览器将自动打开,您可以通过滑块和下拉菜单动态过滤数据,并实时查看图表的更新。
总结
通过本次实战,我们完成了一个交互式仪表盘的开发,展示了 Bokeh 的以下强大功能:
- 快速创建各种图表(折线图、饼图、柱状图)。
- 利用控件(滑块、下拉菜单)动态过滤数据。
- 构建多视图仪表盘并实时更新。
下一步,您可以尝试:
- 将仪表盘部署到云端,让更多用户访问。
- 添加更多控件和图表,丰富数据分析维度。
- 与 Flask 或 Django 集成,构建完整的数据应用。
赶快用 Bokeh 动手构建属于自己的交互式数据可视化项目吧!
相关文章:
探索 Bokeh:轻松创建交互式数据可视化的强大工具
探索 Bokeh:轻松创建交互式数据可视化的强大工具 在数据科学和数据分析领域,交互式数据可视化是一项不可或缺的技能。Bokeh 是一个强大的 Python 库,它可以帮助我们快速构建高质量的交互式图表和仪表盘,同时兼具高性能和灵活性。…...
【Rust自学】6.1. 定义枚举
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 6.1.1. 什么是枚举 枚举允许我们列举所有可能的值来定义一个类型。这与其他编程语言中的枚举类似,但 Rust 的枚举更加灵活和强…...

【Java基础面试题035】什么是Java泛型的上下界限定符?
回答重点 Java泛型的上下界限定符用于对泛型类型参数进行范围限制,主要有上界限定符和下届限定符。 1)上界限定符 (? extends T): 定义:通配符?的类型必须是T或者T的子类,保证集合元素一定是T或者T的子类作用&…...

0基础学前端系列 -- 深入理解 HTML 布局
在现代网页设计中,布局是至关重要的一环。良好的布局不仅能提升用户体验,还能使内容更具可读性和美观性。HTML(超文本标记语言)结合 CSS(层叠样式表)为我们提供了多种布局方式。本文将详细介绍流式布局、Fl…...
【python高级】342-TCP服务器开发流程
CS模式:客户端-服务端模式 TCP客户端开发流程介绍(五步)(C端) 1.创建客户端套接字对象 2.和服务端套接字建立连接 3.发送数据 4.接收数据 5.关闭客户端套接字 TCP服务端开发流程(七步)…...

《计算机组成及汇编语言原理》阅读笔记:p48-p81
《计算机组成及汇编语言原理》学习第 4 天,p48-p81 总结,总计 34 页。 一、技术总结 1.CISC vs RISC p49, complex instruction set computing For example, a complex instruction set computing (CISC) chip may be able to move a lar…...

AI在传统周公解梦中的技术实践与应用
本文深入探讨了人工智能在传统周公解梦领域的技术实践与应用。首先介绍了传统周公解梦的背景与局限性,随后详细阐述了 AI 技术如何应用于梦境数据的采集、整理与分析,包括自然语言处理技术对梦境描述的理解,机器学习算法构建解梦模型以及深度…...

GIS数据处理/程序/指导,街景百度热力图POI路网建筑物AOI等
简介其他数据处理/程序/指导!!!(1)街景数据获取(2)街景语义分割后像素提取,指标计算代码(绿视率,天空开阔度、视觉熵/景观多样性等)(3…...
ssr实现方案
目录 序言 一、流程 二、前端要做的事情 三、节点介绍 四、总结 序言 本文不是详细的实现过程,是让你最快最直接的理解ssr的真正实现方法,有前端经验的同学,能够很好的理解过程,细节根据具体项目实现 一、前端要做的事情 1.…...
手动修改nginx-rtmp模块,让nginx-rtmp-module支持LLHLS
文章目录 1. 背景2. 开发环境搭建2.1 ffmpeg在ubuntu上安装2.2 nginx-rtmp-module在ubuntu上安装2.3 安装vscode环境2. 修改nginx-rtmp-module2.1 主要更新内容2.2 新增配置项2.3 代码更新3. LLHLS验证方法3.1 配置验证3.2 功能验证4. 注意事项5. 已知问题6. 后续计划1. 背景 …...

gitee别人仓库再上传自己仓库
一、新建一个自己的Git仓库 如果没有注册账号的朋友,可以先去注册一个Gitee的账号,用于管理自己的代码特别好用!!! 接下来就是在gitee上新建一个自己的仓库,如下图所示 二、右建 Git Bush Here删除.git文件…...

create-react-app 创建react项目报错 ERESOLVE unable to resolve dependency tree
会报下面这样一个错误,这个错误以前是没有的,最近才出现这个错误。这个非常的蛋疼,意思是testing-library这个库的版本需要react18,但现在安装的是react19。 create-react-app的github是有这个issue的,但官方好像没给…...
从git上下载的项目不完整,关于git lfs
文章目录 问题一、git lfs是什么?二、如何获取git lfs中的文件1.安装 Git LFS2.下载文件 问题 在git上下载的项目无法执行,打开相关文件后发现如下内容: git lfs pull version https://git-lfs.github.com/spec/v1 oid sha256:00920b6723bb39321eea748fd96279f8a…...
sqlite3,一个轻量级的 C++ 数据库库!
宝子们,今天咱来唠唠 sqlite3 这个超棒的轻量级 C 数据库库。它就像是一个小巧但功能齐全的“数据仓库”,能帮咱们轻松地存储、查询和管理数据,无论是开发小型的桌面应用,还是做一些简单的数据处理程序,它都能派上大用…...

Pytorch | 从零构建ParNet/Non-Deep Networks对CIFAR10进行分类
Pytorch | 从零构建ParNet/Non-Deep Networks对CIFAR10进行分类 CIFAR10数据集ParNet架构特点优势应用 ParNet结构代码详解结构代码代码详解SSEParNetBlock 类DownsamplingBlock 类FusionBlock 类ParNet 类 训练过程和测试结果代码汇总parnet.pytrain.pytest.py 前面文章我们构…...

验证 Dijkstra 算法程序输出的奥秘
一、引言 Dijkstra 算法作为解决图中单源最短路径问题的经典算法,在网络路由、交通规划、资源分配等众多领域有着广泛应用。其通过不断选择距离源节点最近的未访问节点,逐步更新邻居节点的最短路径信息,以求得从源节点到其他所有节点的最短路径。在实际应用中,确保 Dijkst…...
二叉树的最小深度
最小深度思路解析: 与求最大深度相比,求最小深度就要简单很多,从上向下访问,只要访问到一个叶节点,证明已经到达了与根节点距离最近的叶节点处,此叶节点的深度即为最小深度.借助队列,如果当前节点为叶节点,则返回该节点的深度为最终结果;如果当前节点不满足上述判断且不为空节…...

C#+OpenCv深度学习开发(常用模型汇总)
在使用 OpenCvSharp 结合深度学习进行机器视觉开发时,有许多现成的模型可以使用。以下是一些常用的深度学习模型,适用于不同的机器视觉任务,包括物体检测、图像分类和分割等。 使用示例 在 OpenCvSharp 中加载和使用这些模型的基本示例&…...

什么样的LabVIEW控制算自动控制?
自动控制是指系统通过预先设计的算法和逻辑,在无人工干预的情况下对被控对象的状态进行实时监测、决策和调整,达到预期目标的过程。LabVIEW作为一种图形化编程工具,非常适合开发自动控制系统。那么,什么样的LabVIEW控制算作“自动…...

Linux系统编程——理解系统内核中的信号捕获
目录 一、sigaction() 使用 信号捕捉技巧 二、可重入函数 三、volatile关键字 四、SIGCHLD信号 在信号这一篇中我们已经学习到了一种信号捕捉的调用接口:signal(),为了深入理解操作系统内核中的信号捕获机制,我们今天再来看一个接口:si…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...