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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux0.11源码分析第二弹——setup.s内容

🚀 前言 继上篇博客分享了boot文件的内容后,本篇博客进而来到第二个文件: setup.s ,对应了《linux源码趣读》的第5~8回。这部分的功能主要就是做了 三件事 ,第一件事是做代码搬运和临时变量存放,第二件事是…

Halcon中histo_2dim(Operator)算子原理及应用详解

在Halcon中,histo_2dim算子是一个用于计算双通道灰度值图像的直方图的工具。以下是对该算子的原理及应用的详细解释: 一、原理 histo_2dim算子的函数原型为:histo_2dim(Regions, ImageCol, ImageRow : Histo2Dim : : )。 输入参数&#xff…

(vue)el-table在表头添加筛选功能

(vue)el-table在表头添加筛选功能 筛选前&#xff1a; 选择条件&#xff1a; 筛选后&#xff1a; 返回数据格式: 代码: <el-tableref"filterTable":data"projectData.list"height"540":header-cell-style"{border-bottom: 1px soli…

使用 Marp 将 Markdown 导出为 PPT 后不可编辑的原因说明及解决方案

Marp 是一个流行的 Markdown 演示文稿工具&#xff0c;能够将 Markdown 文件转换为 PPTX 格式。然而&#xff0c;用户在使用 Marp 导出 PPT 时&#xff0c;可能会遇到以下问题&#xff1a; 导出 PPT 不可直接编辑的原因 根据 Marp GitHub 讨论&#xff0c;Marp 导出的 PPTX 文…

UE5安装Fab插件

今天才知道原来Fab也有类似Quixel Bridge的插件&#xff0c;于是立马就安装上了&#xff0c;这里分享一下安装方法 在Epic客户端 - 库 - Fab Library 搜索 Fab 即可安装Fab插件 然后重启引擎&#xff0c;在插件面板勾选即可 然后在窗口这就有了 引擎左下角也会多出一个Fab图标…

Gin- Cookie\Session相关

Cookie&#xff0c;Session是什么&#xff1f; Cookie直译小饼干&#xff0c;是一些数据信息&#xff0c;类似于小型文本文件&#xff0c;存储在浏览器上。Cookie是进行第一次登录之后&#xff0c;由服务器创建后返回给浏览器的。之后&#xff0c;每当浏览器再次向同一服务器发…

使用Python打造高效的PDF文件管理应用(合并以及分割)

在日常工作和学习中&#xff0c;我们经常需要处理大量PDF文件。手动合并、分割PDF不仅耗时&#xff0c;还容易出错。今天&#xff0c;我们将使用Python的wxPython和PyMuPDF库&#xff0c;开发一个强大且易用的PDF文件管理工具。 C:\pythoncode\new\mergeAndsplitPdf.py 所有代…

深度学习中自适应学习率调度器

传统观点认为&#xff0c;太大的学习率不利于优化深度神经网络&#xff0c;而相比固定的学习率而言&#xff0c;变化的学习率更能提供快速的收敛。基于此&#xff0c;本文作者基于理论基础提出了一个计算深度神经网络学习率的新方法。实验结果证明了该方法的有效性。 训练神经…

文献研读|基于像素语义层面图像重建的AI生成图像检测

前言&#xff1a;本篇文章主要对基于重建的AI生成图像检测的四篇相关工作进行介绍&#xff0c;分别为基于像素层面重建的检测方法 DIRE 和 Aeroblade&#xff0c;以及基于语义层面重建的检测方法 SimGIR 和 Zerofake&#xff1b;并对相应方法进行比较。 相关文章&#xff1a;论…

ElasticSearch06-分片节点分配

零、文章目录 ElasticSearch06-分片节点分配 1、单节点多分片多副本 &#xff08;1&#xff09;启动一个空节点 节点的配置如下 cluster.name: mycluster node.name: node-01 node.master: true node.data: true network.host: 127.0.0.1 http.port: 9201 transport.tcp.p…

信息学奥赛一本通 1438:灯泡 | 洛谷 P5931 [清华集训2015] 灯泡

【题目链接】 ybt 1438&#xff1a;灯泡 洛谷 P5931 [清华集训2015] 灯泡 【题目考点】 1. 三分 求函数极值 2. 相似三角形 3. 对钩函数 【解题思路】 首先考虑影子还没有到达对面墙壁的情况 记BM长度为x&#xff0c;影子为AM&#xff0c;长度为L。三角形ABC相似于三角…

揭开 Choerodon UI 拖拽功能的神秘面纱

01 引言 系统的交互方式主要由点击、选择等组成。为了提升 HZERO 系统的用户体验、减少部分操作步骤&#xff0c;组件库集成了卓越的拖拽功能&#xff0c;让用户可以更高效流畅的操作系统。 例如&#xff1a;表格支持多行拖拽排序、跨表数据调整、个性化调整列顺序&#xff1…

【物联网技术与应用】实验4:继电器实验

实验4 继电器实验 【实验介绍】 继电器是一种用于响应施加的输入信号而在两个或多个点或设备之间提供连接的设备。换句话说&#xff0c;继电器提供了控制器和设备之间的隔离&#xff0c;因为设备可以在AC和DC上工作。但是&#xff0c;他们从微控制器接收信号&#xff0c;因此…

fpga系列 HDL:Quartus II 时序约束 静态时序分析 (STA) test.out.sdc的文件结构

test.out.sdc的文件结构 ## Generated SDC file "test.out.sdc"## Copyright (C) 1991-2013 Altera Corporation ## Your use of Altera Corporations design tools, logic functions ## and other software and tools, and its AMPP partner logic ## functions,…

Windows安全中心(病毒和威胁防护)的注册

文章目录 Windows安全中心&#xff08;病毒和威胁防护&#xff09;的注册1. 简介2. WSC注册初探3. WSC注册原理分析4. 关于AMPPL5. 参考 Windows安全中心&#xff08;病毒和威胁防护&#xff09;的注册 本文我们来分析一下Windows安全中心&#xff08;Windows Security Center…

HTML中的Vue3解析!

#Vue 3 是一个用于构建用户界面的渐进式 JavaScript 框架。它在 HTML 中发挥着重要的作用&#xff0c;可以让开发者轻松地创建交互式的网页应用。与 HTML 结合时&#xff0c;Vue 3 通过自定义指令、组件等方式增强了 HTML 的功能。# 一、vue的概述 Vue 采用了双向数据绑定机制…

ARM嵌入式学习--第八天(PWM)

PWM -PWM介绍 PWM&#xff08;pulse Width Modulation&#xff09;简称脉宽调制&#xff0c;是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术&#xff0c;广泛应用在测量&#xff0c;通信&#xff0c;工控等方面 PWM的频率 是指在1秒钟内&#xff0c;信号从…

TongESB7.1.0.0安装参考指引+测试参考(by lqw)

文章目录 安装安装准备配置jdk安装管理中心&#xff08;manager&#xff09;安装运行时(server)安装mysql并配置manager&#xff08;新装阶段考虑&#xff09;放入授权启动内置redis启动内置redis启动manager和server停止manager和server访问控制台如何在控制台上重置密码 测试…

【现代C++开发】使用现代的C++快速开发一款串口读写软件

文章目录 前言一、必要条件二、实现步骤1.创建项目2.配置代码提示3.安装依赖3.编译程序4. 编写实现代码 前言 最近关于C闹出来的动静态势挺大的&#xff0c;主要是由于爱美丽卡开始抵制C&#xff0c;最近有不少文章都报道了这件事&#xff0c;比如 即使C到了这个时候&#xf…

linux上qt打包(二)

sudo apt install git 新建一个文件夹 名为xiazai&#xff0c; chmod -R 777 xiazai cd xiazai 并进入这个文件夹&#xff0c;然后clone git clone https://github.com/probonopd/linuxdeployqt.git 此处可能要fanQiang才能下 cd linuxdeployqt文件夹 下载平台需要的…