python可视化,强推bokeh!编辑 惊鸿
公众号 惊鸿的世界
想给算法/数据做个可玩的demo却苦于找不到合适的工具?今天给大家分享的是bokeh,本篇将会手把手教你从零开始做出”在线、交互式、炫酷“的demo。
目录鸟瞰bokeh
三分钟上手bokeh
部署你的bokeh
01鸟瞰bokeh
Bokeh是一款强大的数据可视化工具,具备以下五大优点:灵活,简单到复杂一网打尽,从简单可视化到各种复杂的样式及交互式;
可玩,各类组件帮助你交互式、动态地展示数据,观众一目了然;
可共享,方便发布到网页、网站或者jupyter notebook,区别于pyQT等,网页的形式方便分享并且可以随时随地运行和查看;
高效,使用起来非常高效,非常适合javascript用起来不太顺手的人群(比如我),比起js里的ZingCharts,ECharts等,个人还是倾向于熟悉的python,尤其是现在很多AI算法都是基于python的,所以写完算法不用改动太多就可以用bokeh搭建demo,真香!
强大,支持用户使用javascript开发高级的功能。
接下来,本篇从数据、图形、交互、样式四个角度层层递进,带你快速上手bokeh!
02三分钟上手bokeh
必须强调的是,教程有多么详细可能都比不上自己认真读一下官方手册,但是这篇分享的目的在于作为一个抛砖引玉的作用,帮你快速建立对这套框架的关键元素、流程、细节的认知。
2.1 数据
数据是核心,bokeh支持直接使用list、numpy、pandas(这三种大家都比较熟悉),另外,内部提供ColumnDataSource,掌握了这个接口大部分图就可以画了,优势在于可以实现多个图形之间的数据共享,基本使用方法如下:
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource
source = ColumnDataSource(data={'x_values': [1, 2, 3, 4, 5], 'y_values': [6, 7, 2, 3, 6]})
p = figure()
p.circle(x='x_values', y='y_values', source=source)
除此之外,值得一提的还有网络数据结构以及地图数据结构:网络数据结构的基本元素包括:节点样式(形状、颜色)
节点索引
边
节点的实际位置 (横纵坐标)
一起来过一遍官方的例程(注释在每一句末尾):
import math
from bokeh.models import Ellipse, GraphRenderer, StaticLayoutProvider
from bokeh.palettes import Spectral8
from bokeh.plotting import figure
N = 8 # 8个节点
node_indices = list(range(N)) # 节点索引从0到7
graph = GraphRenderer()
graph.node_renderer.data_source.add(node_indices, 'index') # 添加索引
graph.node_renderer.data_source.add(Spectral8, 'color') # 添加颜色
graph.node_renderer.glyph = Ellipse(height=0.1, width=0.2, fill_color='color') # 节点样式为椭圆
graph.edge_renderer.data_source.data = dict(start=[0]*N, end=node_indices) # 边, 起点索引对应终点索引即为一条边
circ = [i*2*math.pi/8 for i in node_indices]
x = [math.cos(i) for i in circ] # 节点的横坐标
y = [math.sin(i) for i in circ] # 节点纵坐标
graph_layout = dict(zip(node_indices, zip(x, y)))
graph.layout_provider = StaticLayoutProvider(graph_layout=graph_layout) # 给节点添加位置信息
地图数据结构——数据支持谷歌地图、CartoDB,坐标支持墨卡托投影、经纬度等。这里不展开赘述。
2.2 图形
图形的种类非常齐全,包含线、点、柱、热图、饼图、地图等,如下图:
图形方面bokeh基本类似于matplotlib,图的各种参数可以在figure中配置,例如图的尺寸大小、横纵坐标范围等,一个图可以包含多种图形,图形参数可以查阅手册,关于具体的图形如何绘制建议查阅官方的图库及示范代码。这里讲一个常用但是容易踩坑的点——figure加载图片,注意点包括加载方式、纵坐标形式两点。加载方式。bokeh除了可以绘制二维数据为图像之外,也可以从图片文件加载,如果是本地运行bokeh,可以用本地图片的路径也可以直接用图片的超链接,但是如果是在服务器运行bokeh,会报错找不到本地图片路径,建议把图片上传到图床,然后用图床的超链接。(推荐图床PicGo[3],支持Github图床,亲测有效)
纵坐标形式。区别于matplotlib里的imshow纵坐标索引默认从上到下,bokeh image默认纵坐标索引为从下到上,这就导致二维数据在bokeh和matplotlib绘出的图片会出现上下翻转的现象。但是bokeh从文件或者链接读取图片不会出现上下翻转(此时纵坐标索引依然默认从下到上)。(左matplotlib imshow,右bokeh image)
2.3 交互
何为”可玩“?交互即可玩!本质是三个要素——对象、事件和回调函数。bokeh提供的交互方式可以分为两大类:基本操作,主要是直接在图上进行交互,例如矩形选择、放大缩小、整体移动、鼠标悬停;
组件,例如文本框、按钮、滑条、下拉框、多选框等,这些组件都可以用on_change等函数对应用户自定义的响应,也可以用js_on_change关联javascript函数。
2.4 样式
样式分为三个层次:图形的样式,例如颜色、尺寸等,这些都可以通过图形的API进行设计,可视化好看与否主要由这部分决定。
2. 多图排版,如何放置多个图也很关键,比如并排、网格等,可以使用gridplot()或者layout()快速实现美观的排版。
3. 其他部分的样式,除了这些图片之外,很多情况下我们都需要一些相关的文字说明或者其他内容,bokeh支持将图形嵌入到html当中,也就是说其他内容样式可以借助于html、css等进行灵活设计。具体怎么做我们将在下一个部分讲解。
03部署bokeh
有了bokeh程序之后如何部署到网站呢?方式有很多种,比如jupyter、Flask、Django、Apache等。这里介绍快速、方便的一种形式——将bokeh server部署到binder。什么是binder?简单来讲就是可以加载github上的jupyter notebook。输入github链接、分支等信息就可以在线跑起来jupyter。
那么如何用binder跑起来我们的bokeh server呢,首先从[4]拉取这个模板,红色是我们需要修改的文件,一个是在yml需要声明运行bokeh需要的包,比如bokeh等,另一个就是bokeh的主体——放置所有bokeh相关程序的文件夹。注意:这个仓库里的程序只给了独立的py程序,也就是没有html、css等。
要加入html和css文件,文件结构如下,也就是在bokeh-app/下面除了py文件还加入了templates/,index.html文件当中可以用{{super()}}的方式继承main.py生成的bokeh所有元素。(也有其他形式,比如独立生成script、div等元素,具体可以参照[5])
├── README.md
├── bokeh-app
│ ├── README.md
│ ├── main.py
│ └── templates
│ ├── index.html
│ └── styles.css
├── bokehserverextension.py
├── environment.yml
└── postBuild
最后,只要把{username}和{repo-name}替换成github的用户名和仓库名就可以。
https://mybinder.org/v2/gh/{username}/{repo-name}/master?urlpath=/proxy/5006/bokeh-app
到这里,我们就成功把bokeh部署到binder上啦!
今天的分享就到这里啦,同系列未来会讲解pyQT、matlab GUI等的使用。