探索 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 动手构建属于自己的交互式数据可视化项目吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/492108.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 中实现节点对齐

Vue 如何将两个 Dom 节点进行对对齐,在前端页面中如何快速的对两个节点元素进行对齐操作,最简单的方式就是使用 Postion:Relative 加 Absolute 实现两个元素的相对位置。今天使用 dom-align 库实现节点对齐,实现以下效果&#xff…

计算机网络-HTTP协议

HTTP HTTP是一种不保存状态,即无状态的协议。HTTP协议自身不对请求和响应之间的通信进行保存。为了保存状态因此后面也有一些技术产生比如Cookies技术。 HTTP是通过URI定位网上的资源,理论上将URI可以访问互联网上的任意资源。 如果不是访问特定的资源…

端到端自动驾驶大模型:视觉-语言-动作模型 VLA

模型框架定义、模型快速迭代能力是考查智驾团队出活能力的两个核心指标。在展开讨论Vision-Language-Action Models(VLA)之前,咱们先来讨论端到端自动驾驶大模型设计。 目录 1. 端到端自动驾驶大模型设计 1.1 模型输入设计 1.2 模型输出设计 1.3 实现难点分析 …

NLP 分词技术浅析

一、NLP 分词技术概述 (一)定义 自然语言处理(NLP)中的分词技术是将连续的文本序列按照一定的规则切分成有意义的词语的过程。例如,将句子 “我爱自然语言处理” 切分为 “我”、“爱”、“自然语言处理” 或者 “我…

深度学习面试相关-2024.12.15记录

深度学习 面试相关- 2024.12.15记录 目录 深度学习 面试相关- 2024.12.15记录整体常问问题1数学基础1.1 概率统计1.2 线代 2机器学习算法2.1 深度学习算法2.2 机器学习算法 整体常问问题 https://www.nowcoder.com/discuss/353154899112304640 1数学基础 1.1 概率统计 htt…

SEO初学者-搜索引擎如何工作

搜索引擎基础搜索引擎是如何建立索引的搜索引擎如何对网页进行排名搜索引擎是如何个性化搜索结果的 搜索引擎的工作方式是使用网络爬虫抓取数十亿个页面。爬虫也称为蜘蛛或机器人,它们在网络上导航并跟踪链接以查找新页面。然后,这些页面会被添加到搜索引…

构建centos docker基础镜像

1、介绍 比较老的版本docker镜像,不太好找,可以尝试自己构建 各版本构建基础镜像方法不太一样,方式也不同,自己尝试,本文只介绍了我自己的尝试 2、构建centos5.11 docker镜像 准备iso文件 (1)安…

多曝光融合中无监督学习方法主导的深度思考

在计算机视觉领域,多曝光融合一直是一个备受关注的研究方向。这项技术旨在将同一场景在不同曝光条件下拍摄的多张图像合成为一张包含完整动态范围信息的图像。近年来,深度学习方法在这个领域取得了显著进展,但有一个有趣的现象值得我们深入探…

Linux脚本语言学习--上

1.shell概述 1.1 shell是什么? Shell是一个命令行解释器,他为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以使用Shell来启动,挂起,停止甚至是编写一些程序。 Shell还是一个功能相当强大…

活动预告|云原生创新论坛:知乎携手 AutoMQ、OceanBase、快猫星云的实践分享

近年来,云原生技术迅猛发展,成为企业数字化转型的关键动力,云原生不仅极大地提升了系统的灵活性和可扩展性,还为企业带来了前所未有的创新机遇。 12 月 28 日 知乎携手 AutoMQ、OceanBase 和快猫星云推出“云原生创新论坛”主题的…

XXE靶场

XXE-lab 靶场 靶场网址&#xff1a;http://172.16.0.87/ 第一步我们看到网站有登录框我们试着用 bp 去抓一下包 将抓到的包发到重放器中 然后我们构建palody <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "php://filter/readconvert.base64-encode/resourceC:/flag/fla…

djiango DRF的使用

djiango DRF的使用 一 、初始 DRF序列化环境安装环境配置数据模型定义定义DRF序列化模型对象 二 、DRF请求和响应请求对象&#xff08;Request objects&#xff09;响应对象&#xff08;Response objects&#xff09;状态码&#xff08;Status codes&#xff09;包装&#xff0…

【BUG】记一次context canceled的报错

文章目录 案例分析gorm源码解读gin context 生命周期context什么时候cancel的什么时候context会被动cancel掉呢&#xff1f; 野生协程如何处理 案例分析 报错信息 {"L":"ERROR","T":"2024-12-17T11:11:33.0050800","file"…

Qt WORD/PDF(四)使用 QAxObject 对 Word 替换(QWidget)

关于QT Widget 其它文章请点击这里: QT Widget 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 姊妹篇: Qt WORD/PDF&#xff08;一&#xff09;使用 QtPdfium库实现 PDF 操作 Qt WORD/PDF&#xff08;二…

使用nvm对node进行多版本管理

1.nvm下载及安装 下载链接 下载完成后&#xff0c;对文件进行解压安装&#xff0c;按照提示一步步安装&#xff0c;如果电脑上之前有安装过node&#xff0c;需要先卸载&#xff0c;再进行安装。 按照提示完成安装。 2.设置环境变量 可以现在C:\Users\name\AppData\Roamin…

基于Socket实现客户端和服务端的Tcp通信(C#)

0.前言 使用C#和Unity实现复刻Liar’s bar中的功能 软件开发大作业 本系列文章用于记录与分享开发过程中使用到的知识点&#xff0c;以及常见错误 本文主要描述有关网络编程的内容 目录 0.前言1.使用Socket搭建Server1.1Server端的Socket连接1.2 Server端接收Client的信息1.3…

eclipse 如何设置项目、不同类型文件的 utf8 编码

编码问题一直是软件开发中让人头疼的小细节&#xff0c;尤其是团队协作中&#xff0c;若编码格式不统一&#xff0c;乱码问题便会频繁出现。那么如何在 Eclipse 中统一设置项目和文件的 UTF-8 编码&#xff0c;避免因编码问题造成不必要的困扰呢&#xff1f;今天&#xff0c;我…

MVC基础——市场管理系统(四)

文章目录 项目地址六、EF CORE6.1 配置ef core环境6.2 code first6.2.1 创建Database context1. 添加navigation property2. 添加MarketContext上下文七、Authentication7.1 添加Identity7.2 Run DB migration for Identity7.3 使用Identity7.3.1 设置认证中间件7.3.2 设置权限…

java后端环境配置

因为现在升学了&#xff0c;以前本来想毕业干java的&#xff0c;很多java的环境配置早就忘掉了&#xff08;比如mysql maven jdk idea&#xff09;&#xff0c;想写个博客记录下来&#xff0c;以后方便自己快速搭建环境 JAVA后端开发配置 环境配置jdkideamavenMySQLnavicate17…

Edge Scdn用起来怎么样?

Edge Scdn&#xff1a;提升网站安全与性能的最佳选择 在当今互联网高速发展的时代&#xff0c;各种网络攻击层出不穷&#xff0c;特别是针对网站的DDoS攻击威胁&#xff0c;几乎每个行业都可能成为目标。为了确保网站的安全性与稳定性&#xff0c;越来越多的企业开始关注Edge …