本文主要材料来自Jake VanderPlas在PyCon 2017上的演讲Python’s Visualization Landscape
Python真是越来越火了。活跃的开源社区为Python这门语言贡献着长青的活力。
子曾经曰过:轮子多了,车就稳了。
本文帮助你选好轮子,也祝愿可视化的车开得越来越稳。
The Landscape
如图。
VanderPlas在展示完这张全景图后给大家贴了这张图:
我差点笑喷。我们的表情包可能要在人民币之前走向国际化了。
回到正题,可视化工具有两个主要阵营,一是基于matplotlib,二是基于JavaScript。还有的接入了JS下著名的D3.js库。
Matplotlib
numpy, pandas, matplotlib可以说是python数据科学的三驾马车。凡以python为教学语言的数据科学相关课程必提这三个库。而matplotlib又有什么特点呢?
先说优点:
- 像MATLAB的语法,对MATLAB用户好上手
- 稳定,久经考验
- 渲染后端丰富,跨平台(GTK, Qt5, svg, pdf等)
缺点也有很多:
- API过于繁琐
- 默认配色太丑
- 对web支持差,交互性差
- 对大数据集处理较慢
于是就有了很多基于matplotlib的扩展,提供了更丰富、更人性化的API。
下面是几个比较受欢迎的包:
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完成渲染。
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')
最终的建议
上车忠告:
- matplotlib必会
- R用户:ggpy/plotnine
- 交互式:plotly(与R接口统一)/bokeh(免费)