当前位置: 首页 > news >正文

探索 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 构建一个交互式仪表盘,完成以下功能:

  1. 按时间查看销售趋势
  2. 对比不同商品类别的销售额占比
  3. 显示各地区销售分布
  4. 通过滑块和下拉菜单动态过滤数据

数据准备

首先,我们模拟一个数据集:

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 的以下强大功能:

  1. 快速创建各种图表(折线图、饼图、柱状图)。
  2. 利用控件(滑块、下拉菜单)动态过滤数据。
  3. 构建多视图仪表盘并实时更新。

下一步,您可以尝试:

  • 将仪表盘部署到云端,让更多用户访问。
  • 添加更多控件和图表,丰富数据分析维度。
  • 与 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服务端开发流程(七步)&#xf…...

《计算机组成及汇编语言原理》阅读笔记: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…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...