选择适合你的Python可视化工具
Python 可视化工具全景图
R的可视化工具包ggplot2为R的流行起到了很好的推动作用。常有人拿这个与Python作比较,认为可视化是Python相对于R的短板。
其实我以为,恰恰是Python的可视化生态过于“丰富”,丰富到有点让人无所适从:
- 这些库各有长短、各有侧重,常常不知如何选择;
- 似乎又都有一些不如人意的地方,让初学习者常换工具,浪费了太多的时间和精力。
所以,本篇将:
- 系统地分析一下Python可视化工具的生态;
- 对一些重要的工具进行一些简单地介绍;
- 最后给出一些如何根据自己的情况选择合适的一两个Python可视化工具的建议。
Python工具知多少?
根据PyViz的登记,目前共有 68 个Python可视化工具(库、包)。其中有11个的作者已不再开发或认可。仍在开发维护的工具有57个之多。前面的图展示了其中目前仍在维护的主要工具。
这么多可视化工具,初看起来确实令人生畏。
对这些工具进行一下归类比较,有助于我们做出合适的选择。
计算机绘图世界的等级制度
**注意:**这是一个草根为自己总结的!
一级,硬件级
计算机绘图世界有两个接近硬件级的底层库,或者叫规范、标准:
- OpenGL,通用的
- Direct3,windows系统上的
一般的显卡制造商基于它们编写显卡(图形)驱动程序。
二级,程序开发语言级
程序开发语言,在底层调用相对低级的图形库,提供一套高级一点的API供程序员使用。如,Python中的PyQtGraph,2D图形使用Qt的GraphicsView框架,3D图形使用OpenGL。
一般情况下,程序开发人员才会直接使用它们。
三级,绘图软件(库、包)级
绘图时直接使用的库和包,如matplotlib,调用Python的PyQtGraph。但一般使用人员都是直接使用matplotlib提供的API接口(函数,对象等)。
需要绘图、可视化的人员使用;做二次开发的人员使用。
四级,二次开发和封装
在三级库包的基础上再开发、封装,如基于matplotlib做二次开发、封装的plotnine、seaborn等。实际上matplotlib的pyplot模块也就是mpl核心对象的封装函数集。
主要用于快速绘图、可视化工作。
IEEE 的 SciVis 和 InfoVis 组
IEEE组织习惯于将Python可视化工具分为两个组:
一是:Scientific Visualization (SciVis) ,科学可视化。主要基于OpenGL图形标准,提供三维或四维物理过程的图形密集可视化,侧重于工程和科学环境。常见的这类Python可视化工具有VisPy, glumpy, GR, Mayavi等。
如使用 VisPy 库绘制螺旋星系图。
螺旋星系图
二是:Information Visualization (InfoVis) ,信息可视化。专注于任意空间中信息的可视化,而不一定是三维物理世界。InfoVis组的库使用打印页面或计算机屏幕的两个维度来抽象、解释空间,通常使用轴和标签。常见的Python这类库有,pandas, NetworkX, Cartopy,ggplot, plotnine, HoloViews, GeoViews,seaborn等。
InfoVis组的细分
我等草根很少需要去使用SciVis组的可视化工具,99%都在InfoVis组选择。
可以根据库的基础语言、等级、应用场景等,InfoVis组的库可以进一步细分为若干个子组:
- Matplotlib: 最古老,也是最受欢迎的InfoVis库之一,具有广泛的2D绘图类型和输出格式。使用桌面GUI工具包(如Qt和GTK)库,重点放在静态图像以及交互式图形上。也对3D提供了一定的支持,但有一些限制。
- 基于matplotlib:多年来,基于Matplotlib二次开发,构建了各种工具。目的有:用于特定类型数据的渲染引擎,用于特定领域(如Pandas中的绘图对DataFrame的支持),或提供更高级别的API以简化绘图步骤(如ggplot, plotnine),或者特定用途(如seaborn的统计绘图)等。
- JavaScript,及基于JavaScript的库。
- JSON,基于JavaScript的D3.js库。
- WebGL,基于WebGL标准的Web绘图。
- **其他,**提供一些特殊的、补充功能的库,如用于可视化网络的graphviz。
根据等级关系分类
根据库在Python可视化生态中所处的位置、领域、状态,可以将68个Python可视化工具分为以下12类:
其中休眠状态的库有11个,原则上不应选择这些库。
为了有一个合适的篇幅,将在下篇中接着讨论:
- Python重要库的介绍;
- 如何选择适合你的Python可视化工具;
- 我为什么选择Matplotlib。
(This end)