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计算时间差的方法
May 20 Python
Python中遍历字典过程中更改元素导致异常的解决方法
May 12 Python
实例探究Python以并发方式编写高性能端口扫描器的方法
Jun 14 Python
Python迭代和迭代器详解
Nov 10 Python
Python简单实现Base64编码和解码的方法
Apr 29 Python
Python分治法定义与应用实例详解
Jul 28 Python
用Python写王者荣耀刷金币脚本
Dec 21 Python
java中两个byte数组实现合并的示例
May 09 Python
不到40行代码用Python实现一个简单的推荐系统
May 10 Python
基于Django静态资源部署404的解决方法
Jul 28 Python
Spark处理数据排序问题如何避免OOM
May 21 Python
python在一个范围内取随机数的简单实例
Aug 16 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
第十五节--Zend引擎的发展
2006/11/16 PHP
PHP5中新增stdClass 内部保留类
2011/06/13 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
Lumen timezone 时区设置方法(慢了8个小时)
2018/01/20 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
使用jQuery异步加载 JavaScript脚本解决方案
2014/04/20 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
DOM基础教程之使用DOM控制表单
2015/01/20 Javascript
JavaScript中使用Math.PI圆周率属性的方法
2015/06/14 Javascript
js代码实现随机颜色的小方块
2015/07/30 Javascript
picLazyLoad 实现图片延时加载(包含背景图片)
2016/07/21 Javascript
javascript 删除数组元素和清空数组的简单方法
2017/02/24 Javascript
关于JavaScript语句后面的分号问题
2017/12/07 Javascript
vue实现页面内容禁止选中功能,仅输入框和文本域可选
2019/11/09 Javascript
Vue+Node实现的商城用户管理功能示例
2019/12/23 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
2021/01/18 Javascript
python学习 流程控制语句详解
2016/06/01 Python
numpy自动生成数组详解
2017/12/15 Python
Python实现matplotlib显示中文的方法详解
2018/02/06 Python
详解python实现线程安全的单例模式
2018/03/05 Python
Python绘图Matplotlib之坐标轴及刻度总结
2019/06/28 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
Python 中@property的用法详解
2020/01/15 Python
基于Python数据结构之递归与回溯搜索
2020/02/26 Python
Python socket处理client连接过程解析
2020/03/18 Python
HTML5 Web Workers之网站也能多线程的实现
2013/04/24 HTML / CSS
捷克家电和家具购物网站:OKAY.cz
2020/07/23 全球购物
采购部岗位职责
2013/11/24 职场文书
合唱兴趣小组活动总结
2014/07/10 职场文书
临床医学专业求职信
2014/08/08 职场文书
学生抄袭作业的检讨书
2014/10/02 职场文书
个人批评与自我批评材料
2014/10/17 职场文书
工作违纪检讨书范文
2015/01/26 职场文书
如何写一份成功的商业计划书
2019/06/25 职场文书
实战 快速定位MySQL的慢SQL
2022/03/22 MySQL