探索 Bokeh:轻松创建交互式数据可视化的强大工具

news2024/12/19 11:26:37

探索 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.value
    line.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 Category20c

category_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_sales
    updated_region_sales = filtered_data.groupby("Region")["Sales"].sum().reset_index()
    region_source.data = updated_region_sales

sales_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 df
    updated_monthly_sales = filtered_data.groupby("Month")["Sales"].sum().reset_index()
    monthly_sales_source.data = updated_monthly_sales
    updated_region_sales = filtered_data.groupby("Region")["Sales"].sum().reset_index()
    region_source.data = updated_region_sales

category_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.coloradmin.cn/o/2262132.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用C语言库函数格式化输入时格式类型与数据类型不匹配导致程序异常

问题 使用两次sscanf()库函数从两个字符串中按照指定的格式读取数据,执行完毕后发现第一个正常读取的数据被篡改。项目在Ubuntu上使用CMake和Ninja构建项目,编译时没有错误和警告。 复现 为方便调试,在keil中编译stm32工程代替&#xff0c…

车牌识别之三:检测+识别的onnx部署(免费下载高精度onnx模型)

依赖 paddle2onnx1.3.1 onnxruntime-gpu1.14.0 ultralytics8.3.38背景 在车牌识别之一:车牌检测(包含全部免费的数据集、源码和模型下载)我们得到了车牌检测模型; 在车牌识别之二:车牌OCR识别(包含全部免费的数据集、源码和模型…

WPF ControlTemplate 控件模板

区别于 DataTemplate 数据模板,ControlTemplate 是控件模板,是为自定义控件的 Template 属性服务的,Template 属性类型就是 ControlTemplate。 演示, 自定义一个控件 MyControl,包含一个字符串类型的依赖属性。 pub…

在IDE中使用Git

我们在开发的时候肯定是经常使用IDE进行开发的,所以在IDE中使用Git也是非常常用的,接下来以IDEA为例,其他的VS code ,Pycharm等IDE都是一样的。 在IDEA中配置Git 1.打开IDEA 2.点击setting 3.直接搜索git 如果已经安装了会自…

Excel中如何消除“长短款”

函数微调可以可以实施,简单且易于操作的气球🎈涨缩更妙。 (笔记模板由python脚本于2024年12月17日 06:19:13创建,本篇笔记适合用Excel操作数据的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Fre…

微命令 微指令 微程序 微操作

微命令是计算机控制部件通过控制线向执行部件发出的各种控制命令,它是构成控制序列的最小单位 微命令与微操作是一一对应的关系,微命令是微操作的控制信号,而微操作是微命令的执行过程。在机器的一个CPU周期中,一组实现一定操作功…

Spring 不推荐使用@Autowired

Spring 不推荐使用Autowired 原因:为什么 Spring和IDEA 都不推荐使用 Autowired 注解_autowired为什么不推荐-CSDN博客 解决方法: 使用Resource注解。 使用构造函数注入。缺点显而易见,当成员变量很多时,构造函数代码冗长&#…

6、AI测试辅助-测试报告编写(生成Bug分析柱状图)

AI测试辅助-测试报告编写(生成Bug分析柱状图) 一、测试报告1. 创建测试报告2. 报告补充优化2.1 Bug图表分析 3. 风险评估 总结 一、测试报告 测试报告内容应该包含: 1、测试结论 2、测试执行情况 3、测试bug结果分析 4、风险评估 5、改进措施…

使用re模块

一、常量 常量说明 re.M re.MULTLINE 多行模式 re.S re.DOTALL 单行模式 re.I re.IGNORECASE 忽略大小写 re.X re.VERBOSE 忽略表达式的空白字符 可以使用|开启多个选项 二、方法 2.1 编译 compile re.compile(pattern,[,falgs]) pattern是正则表达式的字符串 设定falgs&…

自动驾驶控制与规划——Project 2: 车辆横向控制

目录 零、任务介绍一、环境配置二、算法三、代码实现四、效果展示 零、任务介绍 补全src/ros-bridge/carla_shenlan_projects/carla_shenlan_stanley_pid_controller/src/stanley_controller.cpp中的TODO部分。 一、环境配置 上一次作业中没有配置docker使用gpu,…

FFmpeg库之ffmpeg

文章目录 ffmpeg命令行使用基本命令选择流 -map选项 主要命令视频选项音频选项多媒体格式转换滤镜裁剪加水印画中画 录制查看可用的录制设备查看录制设备选项参数录制桌面录制窗口录制摄像头录制麦克风录制系统声音同时录制桌面和麦克风 直播推流拉流 ffmpeg命令行使用 ffmpeg…

模型 信任公式(麦肯锡)

系列文章 分享 模型,了解更多👉 模型_思维模型目录。信任的量化:可信度、可靠性、亲密度、自私度。 1 信任公式(麦肯锡)的应用 1.1 私域用户信任建立(麦肯锡信任公式的应用) 在私域营销领域,与用户建立牢固的信任关系对于提升用…

低延迟!实时处理!中软高科AI边缘服务器,解决边缘计算多样化需求!

根据相关统计,随着物联网的发展和5G技术的普及,到2025年,全球物联网设备连接数将达到1000亿,海量的计算数据使得传输到云端再处理的云计算方式显得更捉襟见肘。拥有低延迟、实时处理、可扩展性和更高安全性的边缘计算应运而生&…

【计算机网络2】计算机网络的性能能指标

目录 一 、计算机网络的性能指标 二、具体介绍 1、速 率 2、带 宽 3、吞 吐 量 4、时 延 5、时延带宽积 6、往 返 时 延 7、信道利用率 一 、计算机网络的性能指标 计算机网络的性能指标就是从不同方面度量计算机网络的性能,有如下7个指标: 速…

密码学——密码学概述、分类、加密技术(山东省大数据职称考试)

大数据分析应用-初级 第一部分 基础知识 一、大数据法律法规、政策文件、相关标准 二、计算机基础知识 三、信息化基础知识 四、密码学 五、大数据安全 六、数据库系统 七、数据仓库. 第二部分 专业知识 一、大数据技术与应用 二、大数据分析模型 三、数据科学 密码学 大数据…

网络攻击与防范

目录 选填 第一章 1、三种网络模式 2、几种创建网络拓扑结构 NAT模式 VPN模式 软路由模式1 软路由模式2 3、Linux网络配置常用指令 4、常见网络服务配置 DHCP DNS Web服务与FTP服务 FTP用户隔离 第二章 DNS信息收集(dnsenum、dnsmap) 路…

网络攻与防

1、两个专网连接 (1)、两个网卡VMNET2/3---配置IP子网、仅主机模式--除去DHCP设置 路由和两台主机分别ping通 (2)、路由配置:两个专网之间连接--否拨号连接 两台主机可相互ping通---成功 如果ping不通,…

react Ant Design

一、通过项目模版创建一个react项目 set NPM_CONFIG_REGISTRYhttps://registry.npmmirror.com pnpm create vite antd-demo cd antd-demo pnpm install pnpm install antd --save 打开项目: 修改:welcome.tsx import React from react; import { Butto…

【排序算法】——选择排序

前言 排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小&#x…

【排序算法】——交换排序

前言 排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小&#x…