Python Bokeh实现实时数据可视化

 更新时间:2024年12月11日 09:01:19   作者:傻啦嘿哟  
在数据分析和科学计算中,数据可视化是不可或缺的一部分,本文将通过简洁的语言和具体的代码示例,介绍如何使用Bokeh库进行实时数据可视化,感兴趣的可以了解下

在数据分析和科学计算中,数据可视化是不可或缺的一部分。它能够直观地展示数据,帮助我们快速发现规律和趋势。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 np
 
app = 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 html
 
if __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应用中等高级用法。

以上就是Python Bokeh实现实时数据可视化的详细内容,更多关于Python Bokeh数据可视化的资料请关注脚本之家其它相关文章!

相关文章

  • Python基础之元编程知识总结

    Python基础之元编程知识总结

    很多人不理解“元编程”是个什么东西,关于它也没有一个十分准确的定义.这篇文章要说的是Python里的元编程,实际上也不一定就真的符合“元编程”的定义.只不过我无法找到一个更准确的名字来代表这篇文章的主题,所以就借了这么一个名号,需要的朋友可以参考下
    2021-05-05
  • python3+PyQt5泛型委托详解

    python3+PyQt5泛型委托详解

    这篇文章主要为大家详细介绍了python3+PyQt5泛型委托的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • python网络编程学习笔记(六):Web客户端访问

    python网络编程学习笔记(六):Web客户端访问

    这篇文章主要介绍了python网络编程之Web客户端访问 ,需要的朋友可以参考下
    2014-06-06
  • Python实战之看图猜字游戏的实现

    Python实战之看图猜字游戏的实现

    看图猜成语,是考验一个人的反应能力,也考验一个人的右脑思维。据说越聪明的人,这道题的完成率越高。本文就来用Python实现这一经典小游戏,需要的可以参考一下
    2023-02-02
  • Python递归调用实现数字累加的代码

    Python递归调用实现数字累加的代码

    今天小编就为大家分享一篇Python递归调用实现数字累加的代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • 完美解决Pycharm中matplotlib画图中文乱码问题

    完美解决Pycharm中matplotlib画图中文乱码问题

    这篇文章主要介绍了完美解决Pycharm中matplotlib画图中文乱码问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Python爬虫抓取技术的一些经验

    Python爬虫抓取技术的一些经验

    这篇文章主要介绍了Python爬虫抓取技术的一些经验,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Python OpenCV实现3种滤镜效果实例

    Python OpenCV实现3种滤镜效果实例

    opencv是一个很强大的库,支持多个编程语言,下面这篇文章主要给大家介绍了关于Python OpenCV实现3种滤镜效果的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • python正则表达式之作业计算器

    python正则表达式之作业计算器

    这篇文章主要为大家详细介绍了python正则表达式之作业计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们
    2016-03-03
  • 如何使用Python控制摄像头录制视频

    如何使用Python控制摄像头录制视频

    这篇文章主要介绍了如何使用Python控制摄像头录制视频,实现过程需要用到三个库tkinter库、PIL库、cv2库,下面将内容详细的一步一步实现,希望对你有所启发并能做一个属于自己的摄像头控制程序
    2022-03-03

最新评论