Jupyter 常见可视化框架选择

对于以Python作为技术栈的数据科学工作者,Jupyter是不得不提的数据报告工具。可能对于R社区而言,鼎鼎大名的ggplot2是常见的可视化框架,而大家对于Python,以及Jupyter为核心的交互式报告的可个视化方案就并没有那么熟悉。本文试图比较几个常用的解决方案,方便大家选择。

选择标准

称述式还是命令式

数据工作者使用的图的类别,常见的就三类:GIS可视化、网络可视化和统计图。因此,大多数场景下,我们并不想接触非常底层的基于点、线、面的命令,所以,选择一个好的封装的框架相当重要。

当然,公认较好的封装是基于《The Grammar of Graphics (Statistics and Computing)》一书,R中的ggplot2基本上就是一个很好的实现。我们基本上可以像用「自然语言」(Natural Language)一样使用这些绘图命令。我们姑且采用计算机科学领域的「陈述式」来表达这种绘图方式。

相反,有时候,以下情形时,我们可能对于这种绘图命令可能并不在意:

  1. 出图相当简单,要求绘制速度,一般大的框架较重(当然只是相对而言);
  2. 想要对细节做非常详尽的微调,一般大框架在微调方面会相对复杂或者退缩成一句句命令;
  3. 是统计作图可视化的创新者,想要尝试做出新的可视化实践。

这些情况下,显然,简单操作式并提供底层绘制命令的框架更让人愉快,与上面类似,我们借用「命令式」描述这类框架。

是否交互

与传统的交付静态图标不同,基于Web端的Jupter的一大好处就是可以绘制交互的图标(最近的RNotebook也有实现),因此,是否选择交互式,也是一个需要权衡的地方。

交互图的优势:

  1. 可以提供更多的数据维度和信息;
  2. 用户端可以做更多诸如放大、选取、转存的操作;
  3. 可以交付BI工程师相应的JavaScript代码用以工程化;
  4. 效果上比较炫酷,考虑到报告接受者的特征可以选择。

非交互图的优势:

  1. 报告文件直接导出成静态文件时相对问题,不会因为转换而损失信息;
  2. 图片可以与报告分离,必要时作为其他工作的成果;
  3. 不需要在运行Notebook时花很多世界载入各类前端框架。

是非内核交互

Jupyter上大多数命令通过以下方式获取数据,而大多数绘图方式事实上只是通过Notebook内的代码在Notebook与内核交互后展示出输出结果。但ipywidgets框架则可以实现Code Cell中的代码与Notebook中的前端控件(比如按钮等)绑定来进行操作内核,提供不同的绘图结果,甚至某些绘图框架的每个元素都可以直接和内核进行交互。

 

3262887070-59fae2a6967b6_articlex

用这些框架,可以搭建更复杂的Notebook的可视化应用,但缺点是因为基于内核,所以在呈递、展示报告时如果使用离线文件时,这些交互就会无效。

框架罗列

matplotlib

最家喻户晓的绘图框架是matplotlib,它提供了几乎所有python内静态绘图框架的底层命令。如果按照上面对可视化框架的分法,matplotlib属于非交互式的的「命令式」作图框架。

3262887070-59fae2a6967b6_articlex

优点是相对较快,底层操作较多。缺点是语言繁琐,内置默认风格不够美观。

matplotlib在jupyter中需要一些配置,可以展现更好的效果,详情参见这篇文章.

ggplot和plotnine

值得一说,对于R迁移过来的人来说,ggplotplotnine简直是福音,基本克隆了ggplot2所有语法。横向比较的话,plotnine的效果更好。这两个绘图包的底层依旧是matplotlib,因此,在引用时别忘了使用%matplotlib inline语句。值得一说的是plotnine也移植了ggplot2中良好的配置语法和逻辑。

3262887070-59fae2a6967b6_articlex

Seaborn

seaborn准确上说属于matplotlib的扩展包,在其上做了许多非常有用的封装,基本上可以满足大部分统计作图的需求,以matplotlib+seaborn基本可以满足大部分业务场景,语法也更加「陈述式」。

缺点是封装较高,基本上API不提供的图就完全不可绘制,对于各类图的拼合也不适合;此外配置语句语法又回归「命令式」,相对复杂且不一致。

3262887070-59fae2a6967b6_articlex

plotly

plotly是跨平台JavaScript交互式绘图包,由于开发者的核心是javascript,所以整个语法类似于写json配置,语法特质也介于「陈述式」和「命令式」之间,无服务版本是免费的。

有点是学习成本不高,可以很快将语句移植到javascript版本;缺点是语言相对繁琐。

3262887070-59fae2a6967b6_articlex

注意:此框架在jupyter中使用需要使用init_notebook_mode()加载JavaScript框架。

bokeh

bokehpydata维护的比较具有潜力的开源交互可视化框架。

值得一说的是,该框架同时提供底层语句和「陈述式」绘图命令。相对来说语法也比较清楚,但其配置语句依旧有很多可视化框架的问题,就是与「陈述式」命令不符,没有合理的结构。此外,一些常见的交互效果都是以底层命令的方式使用的,因此如果要快速实现Dashboard或者作图时就显得较为不便了。

3262887070-59fae2a6967b6_articlex

bqplot

bqplot是基于ipywidgetsd3.js组合发展的内核交互式的可视化框架。语法上采用了和matplotlib大致一致的语法已经相对封装较高的「陈述式语法」。优点是直接和内核交互,可以使用大量控件来实现更多的图像处理,缺点也是直接的,离线文档则不会显示任何图案、控件也都失效。

3262887070-59fae2a6967b6_articlex

其他特殊需求的作图

除了统计作图,网络可视化和GIS可视化也是很常用的,在此只做一个简单的罗列:

GIS类:

  • gmap:交互,使用google maps接口
  • ipyleaflet:交互,使用leaflet接口

网络类:

  • networkx:底层为matplotlib
  • plotly

总结

底层实现 交互方式 语法 语言结构 备注 推荐程度
matplotlib 命令式 底层语言 可以实现复杂底层操作 ★★★
gglot matplotlib 陈述式 ggplot2 建议选择plotnine ★★
plotnine matplotlib 陈述式 ggplot2 完全移植ggplot2 ★★★★★
seaborn matplotlib 陈述式 高级语言 有很多有用的统计图类的封装;但不适合做图拼装 ★★★★★
plotly plotly.js 前端交互 介于命令式和陈述式之间 类似JavaScript 语法类似于json配置 ★★★★
bokeh 前端交互 命令、陈述式 同时有底层语言和高级语言 社区具有潜力 ★★★
bqplot d3.js 内核交互 命令、陈述式 有类似matplotlib底层语言,已经封装好的高级语言 内核交互 ★★★★
1 4 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部