我们在上一篇介绍了 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
函数,它还支持在对角线上放置各变量的直方图或密度图。
不足之处,欢迎指正。