Python Bokeh库:实现实时数据可视化的实战指南

目录

一、Bokeh简介

二、安装Bokeh

三、创建简单的Bokeh图表

四、实时更新图表

五、集成到Flask应用中

六、注意事项

七、总结



在数据分析和科学计算中,数据可视化是不可或缺的一部分。它能够直观地展示数据,帮助我们快速发现规律和趋势。Bokeh是Python中一个强大的数据可视化库,尤其擅长创建交互式和实时更新的图表。本文将通过简洁的语言和具体的代码示例,介绍如何使用Bokeh库进行实时数据可视化。

一、Bokeh简介

Bokeh提供了丰富的图表类型和工具,支持创建复杂的可视化作品,并可以轻松地嵌入到网页中。它的核心特性包括:

  • 交互式图表:用户可以与图表进行交互,如缩放、平移、悬停查看数据点信息等。
  • 实时更新:Bokeh能够实时更新图表,非常适合用于监控和实时数据分析。
  • 丰富的图表类型:包括折线图、柱状图、散点图、热力图等。
  • 易于集成:可以与Jupyter Notebook、Flask等框架无缝集成。

二、安装Bokeh

在开始之前,你需要确保已经安装了Bokeh库。可以使用以下命令进行安装:

pip install bokeh

三、创建简单的Bokeh图表

让我们从创建一个简单的折线图开始,了解Bokeh的基本用法。

from bokeh.plotting import figure, show, output_file
from bokeh.io import output_notebook
import numpy as np# 在Jupyter Notebook中显示Bokeh图表
output_notebook()# 创建数据
x = np.linspace(0, 10, 100)
y = np.sin(x)# 创建图表对象
p = figure(title="Simple Line Plot", x_axis_label='x', y_axis_label='sin(x)')# 添加数据到图表
p.line(x, y, line_width=2)# 显示图表
show(p)

这段代码创建了一个简单的折线图,显示了函数sin(x)在区间[0, 10]上的变化。在Jupyter Notebook中,output_notebook()函数允许直接在笔记本中显示Bokeh图表。

四、实时更新图表

Bokeh的强大之处在于它能够实时更新图表。这通常涉及到两个主要部分:数据源的更新和图表的重绘。

我们可以使用ColumnDataSource作为数据源,并通过回调函数在数据更新时触发图表的重新渲染。以下是一个简单的示例,展示了如何创建一个实时更新的折线图。

from bokeh.plotting import figure, curdoc
from bokeh.models import ColumnDataSource
from bokeh.layout import row
from bokeh.client import push_session
from bokeh.server.server import Server
import numpy as np
import time
import random# 创建数据源
source = ColumnDataSource(data=dict(x=[], y=[]))# 创建图表对象
p = figure(title="Real-time Line Plot", x_axis_label='Time', y_axis_label='Value', x_range=(0, 50))
p.line('x', 'y', source=source, line_width=2)# 更新数据的回调函数
def update():new_data = {'x': source.data['x'] + [source.data['x'][-1] + 1 if source.data['x'] else 0],'y': source.data['y'] + [random.uniform(0, 10)]}source.stream(new_data, rollover=len(source.data['x']) > 50)  # 保持最多50个数据点# 设置回调函数定期调用
curdoc().add_periodic_callback(update, 1000)  # 每1000毫秒(1秒)更新一次# 如果在Jupyter Notebook中运行,则使用show()显示图表
# 否则,使用Bokeh服务器运行
# show(row(p), notebook_handle=True)  # Jupyter Notebook方式# 使用Bokeh服务器方式
session = push_session(curdoc())
try:server = Server({'/': curdoc()}, io_loop=session.loop, allow_websocket_origin=["*"])server.start()session.loop_until_closed()
except KeyboardInterrupt:pass
finally:session.close()server.stop()

在这个示例中,我们创建了一个ColumnDataSource作为数据源,并通过update函数定期更新数据。stream方法用于向数据源添加新数据,rollover参数确保数据源中的数据点数量不会超过50个。我们使用add_periodic_callback方法设置回调函数每1000毫秒(1秒)调用一次。

注意:如果你在Jupyter Notebook中运行这段代码,你可能需要使用show(row(p), notebook_handle=True)来显示图表。然而,对于实时更新,更常见的方式是使用Bokeh服务器。上面的代码示例展示了如何使用Bokeh服务器运行图表,并通过push_session和Server类进行配置。

五、集成到Flask应用中

Bokeh还可以与Flask等Web框架集成,创建完整的Web应用。以下是一个简单的示例,展示了如何将Bokeh图表集成到Flask应用中。

from flask import Flask, render_template_string
from bokeh.plotting import figure
from bokeh.embed import components
from bokeh.resources import CDN
from bokeh.models import ColumnDataSource
import numpy as npapp = Flask(__name__)# 创建Bokeh图表和数据源
source = ColumnDataSource(data=dict(x=np.linspace(0, 10, 100), y=np.sin(np.linspace(0, 10, 100))))
p = figure(title="Flask-integrated Bokeh Plot", x_axis_label='x', y_axis_label='sin(x)')
p.line('x', 'y', source=source, line_width=2)# 将Bokeh图表嵌入到HTML模板中
script, div = components(p, CDN)# 定义Flask路由和视图函数
@app.route('/')
def index():html = render_template_string("""<!doctype html><html lang="en"><head><meta charset="utf-8"><title>Flask-integrated Bokeh Plot</title>{{ script|safe }}</head><body>{{ div|safe }}</body></html>""", script=script, div=div)return htmlif __name__ == '__main__':app.run(debug=True)

在这个示例中,我们首先创建了一个简单的Bokeh图表和数据源。然后,我们使用components函数将图表转换为HTML脚本和div元素。接着,我们定义了一个Flask路由和视图函数,将Bokeh图表嵌入到HTML模板中并返回给客户端。

运行这个Flask应用后,你可以在浏览器中打开http://127.0.0.1:5000/查看嵌入的Bokeh图表。

六、注意事项

  • 性能优化:对于大量数据的实时更新,可能需要考虑性能优化,如减少数据源中的数据点数量、使用更高效的数据结构等。
  • 安全性:在将Bokeh图表集成到Web应用中时,务必注意安全性问题,如防止跨站脚本攻击(XSS)等。
  • 错误处理:在实时数据更新过程中,可能会遇到各种异常情况(如网络中断、数据源异常等),需要做好错误处理。

七、总结

本文介绍了如何使用Python的Bokeh库进行实时数据可视化。我们从一个简单的折线图开始,逐步深入了解了如何实时更新图表、如何将图表集成到Flask应用中等高级用法。通过本文的学习,你应该能够使用Bokeh库创建出美观且功能强大的实时数据可视化作品。希望这对你有所帮助!

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

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

相关文章

月底课程关闭 | 中国大学MOOC公开课《人工智能与交通大数据实战》首次开课,欢迎选修!...

各位小伙伴们,今年我在中国大学MOOC开设面向全国高校师生的《人工智能与交通大数据实战》课程,编号:0818BJTU217,交通、土木、规划、计算机等领域的本科生和研究生都可以选,欢迎大家选课交流!也欢迎大家推荐给身边的同学和学弟学妹们选课!今年首次开课,课程内容与我在北…

Node.js(v16.13.2版本)安装及环境配置教程

一、进入官网地址下载安装包 https://nodejs.org/zh-cn/download/ 选择对应你系统的Node.js版本&#xff0c;这里我选择的是Windows系统、64位&#xff08;v16.13.2版本&#xff09; 下载后的zip文件 二、解压文件到nodejs&#xff0c;并打开文件夹nodejs&#xff0c;复制解压…

UE5 C++ Subsystem 和 多线程

一.Subsystem先做一个简单的介绍&#xff0c;其实可以去看大钊的文章有一篇专门讲这个的。 GamePlay框架基础上的一个增强功能&#xff0c;属于GamePlay架构的范围。Subsystems是一套可以定义自动实例化和释放的类的框架。这个框架允许你从5类里选择一个来定义子类(只能在C定义…

探究有栈协程的实现以及ucontenxt函数族的使用

协程分类 对称协程与非对称协程 协程按概念分为对称协程、非对称协程&#xff0c;对称协程指的是协程a可任意跳转到协程b/c/d&#xff0c;所有的协程都是相同的&#xff0c;可任意跳转&#xff0c;称为对称协程。 非对称协程则是有类似函数调用栈的概念&#xff0c;如协程a调…

容器化:Containerd组件

一 什么是Containerd? Containerd 最早出现在 Docker Engine 中&#xff0c;后来为了将 Docker Engine 做得更加轻量、快速和健壮&#xff0c;在 2016 年 Docker 将 containerd 从 daemon&#xff08;dockerd&#xff09; 中独立出来&#xff0c;并完成了与 daemon 的集成 独…

VBA API 概述 | 宏编程

注&#xff1a;本文为 “VBA API 概述 | 宏编程 | 执行速度慢” 相关文章合辑。 VBA API 详解 Office 二次开发于 2020-12-17 22:27:10 发布 Office 版本变动 在 Office 2010 之前&#xff0c;微软仅提供 32-bit 版本的 Office。而自 Office 2010 起&#xff0c;出现了 32-b…

LLM - 开源视觉多模态 LLaVA-CoT(o1) 深度推理模型 测试与源码 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/144304351 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 LLaVA-…

设计模式之工厂模式:从汽车工厂到代码工厂

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 工厂模式概述 想象一下你走进一家4S店准备买车。作为顾客&#xff0c;你不需要知道汽车是如何被制造出来的&#xff0c;你只需要告诉销售顾问&a…

Apache APISIX快速入门

本文将介绍Apache APISIX&#xff0c;这是一个开源API网关&#xff0c;可以处理速率限制选项&#xff0c;并且可以轻松地完全控制外部流量对内部后端API服务的访问。我们将看看是什么使它从其他网关服务中脱颖而出。我们还将详细讨论如何开始使用Apache APISIX网关。 在深入讨…

2024年12月11日Github流行趋势

项目名称&#xff1a;maigret 项目维护者&#xff1a;soxoj, kustermariocoding, dependabot, fen0s, cyb3rk0tik项目介绍&#xff1a;通过用户名从数千个站点收集个人档案信息的工具。项目star数&#xff1a;12,055项目fork数&#xff1a;870 项目名称&#xff1a;uv 项目维护…

使用pyinstaller打包pyqt的程序,运行后提示ModuleNotFoundError: No module named ‘Ui_main‘

环境&#xff1a;windowpython3.9pyqt6 使用pyqt UI编辑器生成了main.ui &#xff0c;main.ui编译成了Ui_main.py main.py 使用当前目录下的Ui_main.py。 打包过程没报错&#xff0c;运行报错。 错误如下: 解决方法&#xff1a;pyinstaller -Fw main.py --paths. 使…

Linux-音频应用编程

ALPHA I.MX6U 开发板支持音频&#xff0c;板上搭载了音频编解码芯片 WM8960&#xff0c;支持播放以及录音功能&#xff01;本章我们来学习 Linux 下的音频应用编程&#xff0c;音频应用编程相比于前面几个章节所介绍的内容、其难度有所上升&#xff0c;但是笔者仅向大家介绍 Li…

网络应用技术 实验八:防火墙实现访问控制(华为ensp)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验步骤 1、设计全网 IP 地址 2、设计防火墙安全策略 3、在 eNSP 中部署园区网 4、配置用户主机地址 5、配置网络设备 配置交换机SW-1~SW-5 配置路由交换机RS-1~RS-5 配置路由器R-1~R-3 6、配置仿…

低代码云组态支持draw.io导入导出

支持draw.io 官网&#xff1a;draw.io 绘图 进入官网绘制模型&#xff0c;完成后导出 导出 选择“文件“ > “导出“ > “SVG“,完成后即可进行导入 新建 在低代码平台新建一个“网络拓扑”模型&#xff0c;如下图所示&#xff1a; 设计 新建的“网络拓扑”模型进行…

SpringMVC全局异常处理

一、Java中的异常 定义&#xff1a;异常是程序在运行过程中出现的一些错误&#xff0c;使用面向对象思想把这些错误用类来描述&#xff0c;那么一旦产生一个错误&#xff0c;即创建某一个错误的对象&#xff0c;这个对象就是异常对象。 类型&#xff1a; 声明异常&#xff1…

QT自定义控件实践--滑动组件

概述 本篇文章,会逐步带您了解,如何自定义一个QT的滑动组件 操作步骤 选择合适的基类继承: 我们命名这个自定义控件为MySlipButton,继承自QWidget 添加成员变量: 根据滑动组件的特性,添加合适的成员变量,如当前值、最小值、最大值、滑块的位置等。 定义必要的方…

【零成本抽象】基本概念与在C++中的实现

零成本抽象概念是由 Bjarne Stroustrup 提出的&#xff0c;他在 1994 年的著作中就有相关设想&#xff0c;2016 年其在 C 大会登台演讲时&#xff0c;明确阐述了 C 中的 “零成本抽象” 这一理念。 一、零成本抽象概念 Bjarne Stroustrup提出的零成本抽象概念&#xff0c;是指…

基于遗传优化算法的带时间窗多车辆路线规划matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于遗传优化算法的带时间窗多车辆路线规划matlab仿真&#xff0c;通过输入各个节点坐标&#xff0c;以及出发点到节点的时间窗&#xff0c;来进行优化&#xff0…

HTML前端开发-- Iconfont 矢量图库使用简介

一、SVG 简介及基础语法 1. SVG 简介 SVG&#xff08;Scalable Vector Graphics&#xff09;是一种基于 XML 的矢量图形格式&#xff0c;用于在网页上显示二维图形。SVG 图形可以无限缩放而不会失真&#xff0c;非常适合用于图标、图表和复杂图形。SVG 文件是文本文件&#x…

网络安全——防火墙

基本概念 防火墙是一个系统&#xff0c;通过过滤传输数据达到防止未经授权的网络传输侵入私有网络&#xff0c;阻止不必要流量的同时允许必要流量进入。防火墙旨在私有和共有网络间建立一道安全屏障&#xff0c;因为网上总有黑客和恶意攻击入侵私有网络来破坏&#xff0c;防火…