我们在上一篇介绍了 pandas,本篇介绍 matplotlib。
绘图和可视化
一个用于创建出版质量图表的桌面绘图包。
Matplotlib API入门
Figure 和 Subplot
matplotlib的图像都位于Figure对象中。
带有三个subplot的Figure:
这些由fig.add_subplot所返回的对象是AxesSubplot对象,直接调用它们的实例方法就可以在其它空着的格子里画图了。
这时发出一条绘图命令,matplotlib就会在最后一个用过的subplot上进行绘制(如果没有会创建一个):
K--:一个线型选项,用于告诉matplotlib绘制黑色虚线图。
依次画出虚线、直方图、散点图。
根据特定布局创建Figure和subplot的简便方法:plt.subplots, 它可以创建一个新的Figure,并返回一个含有已创建的subplot对象的NumPy数组:
可以对 axes数组进行索引,就像是一个二维数组一样:
还可以通过sharex和sharey指定subplot应该具有相同的X轴或Y轴(刻度),在比较相同范围的数据时用,否则matplotlib会自动缩放各图表的界限。
调整subplot周围的间距
默认情况下,matplotlib会在subplot外围留下一定的边距,在subplot之间留下一定的间距。间距跟图像的高度和宽度有关。
利用Figure的subplots_adjust方法修改间距。
下面的例子间距收缩到 0:
轴标签重叠了,matplotlib不会检查标签是否重叠,这时要自己设定刻度位置和刻度标签。
可以在matplotlib的文档中找到各种图表类型。
颜色、标记和线型
完整的linestyle列表参见plot的文档。
ax.plot(x, y, 'g--') #根据x, y绘制绿色虚线
ax.plot(x, y, linestyle='--', color='g') #更明确的方式,和上面一样的效果
要使用其他任意颜色可以通过指定其 RGB 值的形式(如 #CECECE)
matplotlib创建的是连续的线型图,即点与点之间插值,非实际数据点默认是按线性方式插值的,可以通过drawstyle选项修改:
线型图可以加上一些标记,以强调实际的数据点:
标记类型和线型必须放在颜色后面。
简化的写法:
刻度、标签和图例
过程型的pyplot接口
交互式使用,有xlim, xticks, xticklabels之类的方法,它们分别控制图表的范围,刻度位置,刻度标签等。
调用时不带参数,如plt.xlim()返回当前的X轴绘图范围。
调用时带参数,如plt.xlim([0, 10])会将X轴的范围设置为 0 到 10。
更为面向对象的原生matplotlib API。
设置标题、轴标签、刻度以及刻度标签
绘制一段随机漫步:
修改X轴刻度:set_xticks(数值),set_xticklabels(其他任何的值用作刻度)。
添加图例(legend)
添加图例的方式:添加subplot的时候传入label参数。
调用 ax.legend() 或 plt.legend() 来自动创建图例。
loc告诉matplotlib要将图例放在哪,best选择最不碍事的位置。
去除图例:不传入label或传入label='_nolegend_'(注意有两个下划线)。
注释以及在Subplot上绘图
注释:通过 text, arrow, annotate 等函数进行添加。
matplotlib有一些表示常见图形的对象:称为块(patch),完整的集合位于matplotlib.patches。
创建一个块对象shp,然后通过ax.add_patch(shp)将其添加到subplot中:
图表对象:它们其实就是由块组装而成的。
将图表保存到文件
利用 plt.savefig 可以将当前图表保存到文件。(该方法相当于 Figure 对象的实例方法 savefig)。
如要将图表保存为 SVG 文件:
两个重要的选项:
dpi:控制“每英寸点数”分辨率;
bbox_inches:可以剪除当前图表周围的空白部分。
得到一张带有最小白边且分辨率为 400DPI 的 PNG 图片:
savefig并非一定要写入磁盘,也可写入任何文件型的对象,比如StringIO:
matplotlib配置
操作matplotlib配置系统的方式:Python 编程方式,即利用rc方法。
如将全局的图像默认大小设置为 10 * 10,执行:
plt.rc('figure', figsize=(10, 10))
rc的第一个参数:是希望自定义的对象(如'figure', 'axes', 'xtick', 'ytick', 'grid', 'legend'),这里是figure。
可以跟一系列的关键字参数,将它们写成一个字典:
全部的自定义选项:查阅matplotlib的配置文件matplotlibrc(位于 matplotlib/mpl-data 目录中)。对该文件进行自定义,并将其放在目录中,则每次使用matplotlib时就会加载该文件。
pandas中的绘图函数
在pandas中,有行标签、列标签、分组信息。
要制作一张完整的图表,原本需要一大堆的matplotlib代码,现在只需一两条简洁的语句就可以了。pandas有许多能够利用DataFrame对象数据组织特点来创建标准图表的高级绘图方法。
线型图
Series和DataFrame都有一个用于生成各类图表的plot方法,默认情况下它们都生成线型图。
DataFrame的plot方法会在一个 subplot 中为各列绘制一条线,并自动创建图例。
柱状图
垂直柱状图:Kind='bar'
水平柱状图:Kind='barh'
设置 stacked=True 即可为DataFrame生成堆积柱状图:
柱状图利用value_counts图形化显示Series中各值的出现频率,如:
直方图和密度图
直方图(histogram):是一种可以对值频率进行离散化显示的柱状图。
密度图:通过计算“可能会产生观测数据的连续概率分布的估计”而产生的。
一般的过程是将该分布近似为一组核(如正态(高斯)分布之类的较为简单的分布)。
密度图也被称作 KDE 图(Kernel Density Estimate 核密度估计)。
直方图和密度图常被画在一起,直方图以规格化形式给出(以便给出面元密度),再在其上绘制核密度估计。
由两个不同的标准正态分布组成的双峰分布:
最后一行代码绘制的密度图的最终结果:
散布图
散布图(scatter plot):是观察两个一维数据序列之间关系的有效手段。
matplotlib的scatter方法是绘制散布图的主要方法。
在探索式数据分析工作中,同时观察一组变量的散布图是很有意义的。也被称为散布图矩阵(scatter plot matrix)。
pandas提供了一个能从DataFrame创建散布图矩阵的 scatter_matrix 函数,它还支持在对角线上放置各变量的直方图或密度图。
不足之处,欢迎指正。