信息可视化(也叫绘图)是数据分析中最重要的工作之一。它可能是探索过 程的一部分,例如,帮助我们找出异常值、必要的数据转换、得出有关模型 的idea等。另外,做一个可交互的数据可视化也许是工作的最终目标。Python有许多库进行静态或动态的数据可视化,但我这里重要关注于matplotlib(http://matplotlib.org/)和基于它的库。
matplotlib是一个用于创建出版质量图表的桌面绘图包(主要是2D方面)。该 项目是由John Hunter于2002年启动的,其目的是为Python构建一个MATLAB式的绘图接口。matplotlib和IPython社区进行合作,简化了从IPython shell(包括现在的Jupyter notebook)进行交互式绘图。matplotlib支持各种操作系统上许多不同的GUI后端,而且还能将图片导出为各种常见 的矢量(vector)和光栅(raster)图:PDF、SVG、JPG、PNG、BMP、GIF等。除了几张,本书中的大部分图都是用它生成的。
随着时间的发展,matplotlib衍生出了多个数据可视化的工具集,它们使用matplotlib作为底层。其中之一是seaborn(http://seaborn.pydata.org/),下一篇博客会学习它。
学习本篇博客代码案例的最简单方法是在Jupyter notebook进行交互式绘图。在Jupyter notebook中执行下面的语句:
%matplotlib notebook
目录
1. API入门
matplotlib的通常引入约定是:
import matplotlib.pyplot as plt
在Jupyter中运行%matplotlib notebook(或在IPython中运行%matplotlib), 就可以创建一个简单的图形。如果一切设置正确,会看到下图:
import numpy as np
data = np.arange(10)
print(data)
plt.plot(data)
虽然seaborn这样的库和pandas的内置绘图函数能够处理许多普通的绘图任 务,但如果需要自定义一些高级功能的话就必须学习matplotlib API。
虽然本书没有详细地讨论matplotlib的各种功能,但足以将你引入 门。matplotlib的示例库和文档是学习高级特性的最好资源。
2. Figure和Subplot
matplotlib的图像都位于Figure对象中。你可以用plt.figure创建一个新的Figure:
fig = plt.figure()
如果用的是IPython,这时会弹出一个空窗口,但在Jupyter中,必须再输入 更多命令才能看到。plt.figure有一些选项,特别是figsize,它用于确保当图 片保存到磁盘时具有一定的大小和纵横比。
不能通过空Figure绘图。必须用add_subplot创建一个或多个subplot才行:
ax1 = fig.add_subplot(2,2,1)
这条代码的意思是:图像应该是2×2的(即最多4张图),且当前选中的是4个subplot中的第一个(编号从1开始)。如果再把后面两个subplot也创建出 来,最终得到的图像如下图所示:
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
使用Jupyter notebook有一点不同,即每个小窗重新执行后,图 形会被重置。因此,对于复杂的图形,,你必须将所有的绘图命令存在 一个小窗里。
这里,我们运行同一个小窗里的所有命令:
fig = plt.figure()
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
如果这时执行一条绘图命令(如plt.plot([1.5, 3.5, -2, 1.6])),matplotlib就会 在最后一个用过的subplot(如果没有则创建一个)上进行绘制,隐藏创建figure和subplot的过程。因此,如果我们执行下列命令,你就会得到如下图所示的结果:
plt.plot(np.random.randn(50).cumsum(),'k--')
"k--"是一个线型选项,用于告诉matplotlib绘制黑色虚线图。上面那些由fig.add_subplot所返回的对象是AxesSubplot对象,直接调用它们的实例方法 就可以在其它空着的格子里面画图了,如下图所示:
ax1.hist(np.random.randn(50),bins=20,color='k',