Python可视化工具指引

ddlee · May 28, 2017

本文主要材料来自Jake VanderPlas在PyCon 2017上的演讲Python’s Visualization Landscape

Python真是越来越火了。活跃的开源社区为Python这门语言贡献着长青的活力。

子曾经曰过:轮子多了,车就稳了。

本文帮助你选好轮子,也祝愿可视化的车开得越来越稳。

The Landscape

landscape

如图。

VanderPlas在展示完这张全景图后给大家贴了这张图:

chan

我差点笑喷。我们的表情包可能要在人民币之前走向国际化了。

回到正题,可视化工具有两个主要阵营,一是基于matplotlib,二是基于JavaScript。还有的接入了JS下著名的D3.js库。

Matplotlib

numpy, pandas, matplotlib可以说是python数据科学的三驾马车。凡以python为教学语言的数据科学相关课程必提这三个库。而matplotlib又有什么特点呢?

先说优点:

  1. 像MATLAB的语法,对MATLAB用户好上手
  2. 稳定,久经考验
  3. 渲染后端丰富,跨平台(GTK, Qt5, svg, pdf等)

缺点也有很多:

  1. API过于繁琐
  2. 默认配色太丑
  3. 对web支持差,交互性差
  4. 对大数据集处理较慢

于是就有了很多基于matplotlib的扩展,提供了更丰富、更人性化的API。

matplotlib

下面是几个比较受欢迎的包:

pandas

pandas的DataFrame对象是有plot()方法的,如: iris.plot.scatter('petalLength', 'petalWidth')生成二维散点图,只需指明两个轴取自哪一列数据即可。

seaborn

seaborn(gallery)专注于统计数据可视化,默认配色也还可以。语法示例:

import seaborn as sns
sns.lmplot('petalLength', 'sepalWidth', iris, hue='species', fit_reg=False)

类ggplot

对于R用户,最熟悉的可视化包可能是ggplot2,在python中可以考虑ggpy和近期上了Github Trends的plotnie

JavaScript

基于JS的包常常具有非常好的交互性,其共同点是将图形格式化为json文件,再由JS完成渲染。

js

Bokeh

Bokeh(Gallery)定位于绘制用于浏览器展示的交互式图形。其优点是交互性、能够处理大量数据和流数据。语法示例:

p = figure()
p.circle(iris.petalLength, iris.sepalWidth)
show(p)

Plotly

Plotly(Gallery)跟Bokeh类似。但其提供了多种语言接口(JS, R, Python, MATLAB),并且支持3D和动画效果,缺点是有些功能需要付费。 语法示例:

from plotly.graph_objs import Scatter
from plotly.offline import iplot
p = Scatter(x=iris.petalLength,
            y=iris.sepalWidth,
            mode='markers')
iplot(p)

处理大型数据集

对于大型数据集,可以考虑的包包括datashader, Vaex, 基于OpenGL的Vispy和Glumpy,GlueViz等。这里介绍datashader。

datashader

datashader是Bokeh的子项目,为处理大型数据集而生。

示例语法:

from colorcet import fire
export(tf.shade(agg, cmap=cm(fire, 0.2), how='eq_hist'), 'census_ds_fier_eq_hist')

fire

最终的建议

上车忠告:

  1. matplotlib必会
  2. R用户:ggpy/plotnine
  3. 交互式:plotly(与R接口统一)/bokeh(免费)