探索 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…...

《Java 与 OpenAI 协同:开启智能编程新范式》
在当今科技飞速发展的时代,人工智能已成为推动各领域创新变革的核心力量。OpenAI 作为人工智能领域的领军者,其开发的一系列强大模型,如 GPT 系列,为自然语言处理等诸多任务带来了前所未有的突破。而 Java,作为一种广泛…...

基于Python大数据的电影可视化分析系统
标题:基于 Python 大数据的电影可视化分析系统 内容:1.摘要 本文介绍了一个基于 Python 大数据的电影可视化分析系统。该系统通过收集和分析大量电影数据,提供了对电影市场的深入洞察。文章首先介绍了系统的背景和目的,然后详细描述了系统的架构和功能。…...

【杂谈】-为什么Python是AI的首选语言
为什么Python是AI的首选语言 文章目录 为什么Python是AI的首选语言1、为何 Python 引领人工智能发展1.1 可用性和生态系统1.2 用户群和用例1.3 效率辅助 2、AI项目对Python开发人员的要求3、如何开启你的 AI 学习之旅 人工智能的广泛应用正在软件工程领域引发范式转变。Python凭…...

(高可用版本)Kubeadm+Containerd+keepalived部署高可用k8s(v1.28.2)集群
KubeadmContainerdkeepalived部署高可用k8s(v1.28.2)集群 一.环境准备,二.容器运行时Containerd安装请参照前文。KubeadmContainerd部署k8s(v1.28.2)集群(非高可用版)-CSDN博客 文章目录 KubeadmContainerdkeepalived部署高可用k8s(v1.28.2)集…...

单片机:实现自动关机电路(附带源码)
单片机实现自动关机电路 在许多嵌入式系统或便携式设备中,自动关机功能非常重要,尤其是在电池供电的设备中,防止设备长时间开启以节省电能。自动关机电路的基本功能是检测设备是否处于待机状态,若一定时间内未收到用户操作信号或…...

【YashanDB知识库】ycm-YashanDB列表有数据库显示故障排除步骤
本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7802959.html?templateId1718516 数据库状态 正常 异常 1、查看告警列表 例如:告警显示实例无法连接,一般是数据库实例服务掉了,需要尽快联系系统…...

高级的SQL查询技巧有哪些?
成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于高级SQL查询技巧方面的相关内容…...

使用 UniApp 在微信小程序中实现 SSE 流式响应
概述 服务端发送事件(Server-Sent Events, SSE)是一种允许服务器向客户端推送实时更新的技术。SSE 提供了一种单向的通信通道,服务器可以持续地向客户端发送数据,而不需要客户端频繁发起请求。这对于需要实时更新的应用场景非常有…...

transformer用作分类任务
系列博客目录 文章目录 系列博客目录1、在手写数字图像这个数据集上进行分类1. 数据准备2. 将图像转化为适合Transformer的输入3. 位置编码4. Transformer编码器5. 池化操作6. 分类头7. 训练8. 评估总结流程:相关模型: 1、在手写数字图像这个数据集上进行…...

【枚举】假币问题
题目描述: 有12枚硬币。其中有11枚真币和1枚假币。假币和真币重量不同,但不知道假币比真币轻还是重。现在,用一架天平称了这些币三次,告诉你称的结果,请你找出假币并且确定假币是轻是重(数据保证一定能找出…...