Django上使用数据可视化利器Bokeh解析


Posted in Python onJuly 31, 2019

前言

最近在实验室做的一个项目中,需要把大量的数据在 web 端进行可视化,需要绘制各类图表。数据都是以 csv 文件的形式保存在服务器中。本来是想使用 D3.js 这个数据可视化前端库来画图,但是需要编写大量的 js 代码。后来发现了 Bokeh 这个框架,只需要在后端编写及少量的 Python 代码生成对应的 html 与 js,再传送到前端让浏览器解析,大大的减少了工作量。

1. 波形图

这里绘制一个包含了数千个数据点的信号波形图,绘制方法和 Matlab 如出一辙。学习成本为零。

import pandas as pd
from bokeh.plotting import figure
from bokeh.io import output_file, show

csv_file = 'points.csv'
data = pd.read_csv(csv_file)
TOOLS = 'hover,crosshair,pan,wheel_zoom,box_zoom,reset,save,box_select'
picture = figure(width=1000, height=400, tools=TOOLS)
picture.line(data['order'], data['value'], color='blue', alpha=0.5)
output_file('waveform.html', title='waveform')
show(picture)

points.csv 中包含了 2048 个点。上面这段脚本是直接生成了一个 html 文件,show(picture)语句打开了这个 html 文件。效果如下:

Django上使用数据可视化利器Bokeh解析

右侧的工具栏是通过TOOLS = 'hover,crosshair,pan,wheel_zoom,box_zoom,reset,save,box_select'设置的。包含了常见的一些功能,包括缩放,保存,重置等等。由于简书的 markdown 不支持直接插入 div 块和 js 脚本,所以只能截取一个图放在这里,不能体验到右侧的工具栏的使用感受。

2. 集成到 Django 中

上面的例子是直接生成了一个 html 文件,但在正常的使用中,只应该生成对应的 div 和 js 就行了。
在 Django 的 view.py 中,定义一个 view。

def waveform(request):
  csv_file = 'your file'
  data = pd.read_csv(csv_file) 
  TOOLS = "hover,crosshair,pan,wheel_zoom,box_zoom,reset,save,box_select"
  picture = figure(width=1200, height=400, tools=TOOLS) 
  picture.line(data['order'], data['value'], color='blue', alpha=0.5)
  script, div = components(picture, CDN)
  return render(request, 'waveform.html', {'script': script, 'div': div})

这样就把对应的 template 的 waveform.html 中:

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Experiment with Bokeh</title>
  <link href="{% static 'bokeh-0.12.4.min.css' %}" rel="stylesheet" type="text/css">
  <link href="{% static 'bokeh-widgets-0.12.4.min.css' %}" rel="stylesheet" type="text/css">
  <script src="{% static 'bokeh-0.12.4.min.js' %}"></script>
  <script src="{% static 'bokeh-widgets-0.12.4.min.js' %}"></script>
  {{ script |safe }}
</head>
<body>
{{ div |safe }}
</body>
</html>

这里有一个不太好的地方,把 script 放到了 head 里面。

然而要是放在底部。就不能正确画出图了。(求大神解答)

3. 时频图

在经过短时傅里叶变换输出的结果,可以用 image 来显示时频分布图。与 Matlab 画出来的也是如出一辙。

import numpy as np
import pandas as pd
from bokeh.io import output_file, show
from bokeh.plotting import figure
data = pd.read_csv('tf_stft.csv')
value = np.array(data['value'])
d = np.reshape(value, (338, 124))
d = np.transpose(d)
TOOLS = "hover,crosshair,pan,wheel_zoom,box_zoom,reset,save,box_select"
p = figure(x_range=(0, 62), y_range=(0, 169), tools=TOOLS)
p.image(image=[d], x=0, y=0, dw=62, dh=169, palette="Viridis256")
output_file("image.html", title="image.py example")
show(p)

结果如下:

Django上使用数据可视化利器Bokeh解析

如果是使用 D3.js 来绘制这个图形的话,就比较费劲了。

4. 小结

Bokeh 这个框架,比起 D3.js,它的可视化选项相对较少。因此,目前来看 Bokeh 无法挑战 D3.js 的霸主地位。而且 Bokeh 过于依赖 python 的数值计算库,并非一个纯前端的框架,使得它的使用范围也小于 D3.js。

而在纯 python 的数值计算领域,也已经有 matplotlib 这种提供了与 Matlab 一模一样的接口的数据可视化库,Bokeh 的适用场景也并不多。
但是,它非常适合嵌入 Flask 或者 Django 的程序中,非常好用,速度也很快。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 匹配任意字符(包括换行符)的正则表达式写法
Oct 29 Python
python使用urllib2模块获取gravatar头像实例
Dec 18 Python
python利用datetime模块计算时间差
Aug 04 Python
python中使用zip函数出现错误的原因
Sep 28 Python
详解Python3中ceil()函数用法
Feb 19 Python
提升Python程序性能的7个习惯
Apr 14 Python
python Django编写接口并用Jmeter测试的方法
Jul 31 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
Feb 12 Python
Python3.7实现验证码登录方式代码实例
Feb 14 Python
Python Switch Case三种实现方法代码实例
Jun 18 Python
在vscode中启动conda虚拟环境的思路详解
Dec 25 Python
Python max函数中key的用法及原理解析
Jun 26 Python
Flask框架单例模式实现方法详解
Jul 31 #Python
pycharm配置当鼠标悬停时快速提示方法参数
Jul 31 #Python
详细介绍Python进度条tqdm的使用
Jul 31 #Python
处理Selenium3+python3定位鼠标悬停才显示的元素
Jul 31 #Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
Jul 31 #Python
django解决订单并发问题【推荐】
Jul 31 #Python
python opencv将图片转为灰度图的方法示例
Jul 31 #Python
You might like
PHP+javascript模拟Matrix画面
2006/10/09 PHP
php 求质素(素数) 的实现代码
2011/04/12 PHP
学习php过程中的一些注意点的总结
2013/10/25 PHP
php页面防重复提交方法总结
2013/11/25 PHP
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
2017/07/10 PHP
jQuery 各种浏览器下获得日期区别
2008/12/22 Javascript
angularjs基础教程
2014/12/25 Javascript
jQuery中position()方法用法实例
2015/01/16 Javascript
JavaScript中的anchor()方法使用详解
2015/06/08 Javascript
详解JavaScript中的blink()方法的使用
2015/06/08 Javascript
JS动态给对象添加属性和值的实现方法
2016/10/21 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
JS内部事件机制之单线程原理
2018/07/02 Javascript
vue实现鼠标移入移出事件代码实例
2019/03/27 Javascript
小程序rich-text组件如何改变内部img图片样式的方法
2019/05/22 Javascript
JS代码触发事件代码实例
2020/01/02 Javascript
Vue实现点击当前行变色
2020/12/14 Vue.js
Python列表(list)常用操作方法小结
2015/02/02 Python
Python脚本实现Web漏洞扫描工具
2016/10/25 Python
django实现前后台交互实例
2017/08/07 Python
Python smtplib实现发送邮件功能
2018/05/22 Python
使用wxpy实现自动发送微信消息功能
2020/02/28 Python
Python实现Wordcloud生成词云图的示例
2020/03/30 Python
python zip,lambda,map函数代码实例
2020/04/04 Python
python 字典item与iteritems的区别详解
2020/04/25 Python
如何用H5实现一个触屏版的轮播器的实例
2017/01/09 HTML / CSS
Omio中国:全欧洲低价大巴、火车和航班搜索和比价
2018/08/09 全球购物
英国折扣零售连锁店:QD Stores
2018/12/08 全球购物
合伙经营协议书
2014/04/18 职场文书
幼儿园教师的考核评语
2014/04/18 职场文书
优秀员工事迹材料
2014/12/20 职场文书
员工旷工检讨书
2015/08/15 职场文书
分析MySQL抛出异常的几种常见解决方式
2021/05/18 MySQL
python 如何做一个识别率百分百的OCR
2021/05/29 Python
Redis+Lua脚本实现计数器接口防刷功能(升级版)
2022/02/12 Redis