手把手教你数据可视化
itomcoil 2024-12-31 12:24 32 浏览
想给算法/数据做个可玩的demo却苦于找不到合适的工具?今天给大家分享的是bokeh,本篇将会手把手教你从零开始做出”在线、交互式、炫酷“的demo。
目录
- 鸟瞰bokeh
- 三分钟上手bokeh
- 部署你的bokeh
鸟瞰bokeh
Bokeh是一款强大的数据可视化工具,具备以下五大优点:
- 灵活,简单到复杂一网打尽,从简单可视化到各种复杂的样式及交互式;
- 可玩,各类组件帮助你交互式、动态地展示数据,观众一目了然;
- 可共享,方便发布到网页、网站或者jupyter notebook,区别于pyQT等,网页的形式方便分享并且可以随时随地运行和查看;
- 高效,使用起来非常高效,非常适合javascript用起来不太顺手的人群(比如我),比起js里的ZingCharts,ECharts等,个人还是倾向于熟悉的python,尤其是现在很多AI算法都是基于python的,所以写完算法不用改动太多就可以用bokeh搭建demo,真香!
- 强大,支持用户使用javascript开发高级的功能。
接下来,本篇从数据、图形、交互、样式四个角度层层递进,带你快速上手bokeh!
三分钟上手bokeh
必须强调的是,教程有多么详细可能都比不上自己认真读一下官方手册,但是这篇分享的目的在于作为一个抛砖引玉的作用,帮你快速建立对这套框架的关键元素、流程、细节的认知。
数据是核心,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,坐标支持墨卡托投影、经纬度等。这里不展开赘述。
图形的种类非常齐全,包含线、点、柱、热图、饼图、地图等,如下图:
图形方面bokeh基本类似于matplotlib,图的各种参数可以在figure中配置,例如图的尺寸大小、横纵坐标范围等,一个图可以包含多种图形,图形参数可以查阅手册,关于具体的图形如何绘制建议查阅官方的图库及示范代码。这里讲一个常用但是容易踩坑的点——figure加载图片,注意点包括加载方式、纵坐标形式两点。
- 加载方式。bokeh除了可以绘制二维数据为图像之外,也可以从图片文件加载,如果是本地运行bokeh,可以用本地图片的路径也可以直接用图片的超链接,但是如果是在服务器运行bokeh,会报错找不到本地图片路径,建议把图片上传到图床,然后用图床的超链接。(推荐图床PicGo[3],支持Github图床,亲测有效)
- 纵坐标形式。区别于matplotlib里的imshow纵坐标索引默认从上到下,bokeh image默认纵坐标索引为从下到上,这就导致二维数据在bokeh和matplotlib绘出的图片会出现上下翻转的现象。但是bokeh从文件或者链接读取图片不会出现上下翻转(此时纵坐标索引依然默认从下到上)。(左matplotlib imshow,右bokeh image)
何为”可玩“?交互即可玩!本质是三个要素——对象、事件和回调函数。bokeh提供的交互方式可以分为两大类:
- 基本操作,主要是直接在图上进行交互,例如矩形选择、放大缩小、整体移动、鼠标悬停;
- 组件,例如文本框、按钮、滑条、下拉框、多选框等,这些组件都可以用on_change等函数对应用户自定义的响应,也可以用js_on_change关联javascript函数。
样式分为三个层次:
- 图形的样式,例如颜色、尺寸等,这些都可以通过图形的API进行设计,可视化好看与否主要由这部分决定。
- 多图排版,如何放置多个图也很关键,比如并排、网格等,可以使用gridplot()或者layout()快速实现美观的排版。
- 其他部分的样式,除了这些图片之外,很多情况下我们都需要一些相关的文字说明或者其他内容,bokeh支持将图形嵌入到html当中,也就是说其他内容样式可以借助于html、css等进行灵活设计。具体怎么做我们将在下一个部分讲解。
部署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等的使用。
参考文献
[1] https://bokeh.org/
[2] https://mybinder.org/
[3] https://github.com/Molunerfinn/PicGo
[4] https://github.com/binder-examples/bokeh
[5] https://github.com/bokeh/bokeh/tree/branch-2.3/examples/app/gapminder
相关推荐
- selenium(WEB自动化工具)
-
定义解释Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),MozillaF...
- 开发利器丨如何使用ELK设计微服务中的日志收集方案?
-
【摘要】微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中...
- 高并发系统设计:应对每秒数万QPS的架构策略
-
当面试官问及"如何应对每秒几万QPS(QueriesPerSecond)"时,大概率是想知道你对高并发系统设计的理解有多少。本文将深入探讨从基础设施到应用层面的解决方案。01、理解...
- 2025 年每个 JavaScript 开发者都应该了解的功能
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.Iteratorhelpers开发者...
- JavaScript Array 对象
-
Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...
- Gemini 2.5编程全球霸榜,谷歌重回AI王座,神秘模型曝光,奥特曼迎战
-
刚刚,Gemini2.5Pro编程登顶,6美元性价比碾压Claude3.7Sonnet。不仅如此,谷歌还暗藏着更强的编程模型Dragontail,这次是要彻底翻盘了。谷歌,彻底打了一场漂亮的翻...
- 动力节点最新JavaScript教程(高级篇),深入学习JavaScript
-
JavaScript是一种运行在浏览器中的解释型编程语言,它的解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript广泛用于浏览器客户端编程,通常JavaScript脚本是通过嵌...
- 一文看懂Kiro,其 Spec工作流秒杀Cursor,可移植至Claude Code
-
当Cursor的“即兴编程”开始拖累项目质量,AWS新晋IDEKiro以Spec工作流打出“先规范后编码”的系统工程思维:需求-设计-任务三件套一次生成,文档与代码同步落地,复杂项目不...
- 「晚安·好梦」努力只能及格,拼命才能优秀
-
欢迎光临,浏览之前点击上面的音乐放松一下心情吧!喜欢的话给小编一个关注呀!Effortscanonlypass,anddesperatelycanbeexcellent.努力只能及格...
- JavaScript 中 some 与 every 方法的区别是什么?
-
大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力在JavaScript中,Array.protot...
- 10个高效的Python爬虫框架,你用过几个?
-
小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapysc...
- 12个高效的Python爬虫框架,你用过几个?
-
实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...
- pip3 install pyspider报错问题解决
-
运行如下命令报错:>>>pip3installpyspider观察上面的报错问题,需要安装pycurl。是到这个网址:http://www.lfd.uci.edu/~gohlke...
- PySpider框架的使用
-
PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...
- 「机器学习」神经网络的激活函数、并通过python实现激活函数
-
神经网络的激活函数、并通过python实现whatis激活函数感知机的网络结构如下:左图中,偏置b没有被画出来,如果要表示出b,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...
- 一周热门
- 最近发表
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)