简介
本文将继续介绍matplotlib的绘图基础,前面也提到过子图(subplots)的使用,在这里我们会详细介绍如何通过subplots绘制子图。在本文中,你将学到:
- add_subplot和subplots方法绘制子图;
- 为什么用plt和坐标轴实例ax方法都能绘图。
add_subplot方法
在前面我们是这样来建立一个坐标轴的:
1 2 3 4 5 |
>>>import matplotlib.pyplot as plt >>>import numpy as np >>>fig = plt.figure() >>>ax = fig.add_axes([0.1, 0.1, 0.8, 0.8] |
可以看出这种方式只能建立一个坐标轴,如果想建立多个子坐标轴的话,就可以使用 add_subplot 方法:
1 |
>>>ax1 = fig.add_subplot(2, 2, 1) |
这句代码的意思是添加大小为(2*2)的子图,也就是四个坐标轴,2行2列排布。后面的1表示这四个坐标轴的第一个,它们的顺序依次是:
1 | 2 |
3 | 4 |
于是我们可以把接下来的坐标轴也表示出来:
1 2 3 |
>>>ax2 = fig.add_subplot(2, 2, 2) >>>ax3 = fig.add_subplot(2, 2, 3) >>>ax4 = fig.add_subplot(2, 2, 4) |
此时发出一条绘图命令:
1 2 |
>>>plt.plot([1, 2, 3, 4]) >>>plt.show() |
显示出来,就得到如下图形:
为什么是在最后一张图上绘图呢?
事实上, plt.plot() 命令应用在最近的subplot上,所以在这里就等价于 ax4.plot() 。因此,可以看出常规的 plt.plot() 方法绘图缺乏灵活性,而使用 ax1, ax2, ax3, ax4 能指定在对应的坐标上绘图,这也就是为什么提倡显式建立坐标轴 axes 的原因。
subplots方法
使用subplots方法能够更快捷地建立好所有坐标轴。
1 |
>>>fig, axes = plt.subplots(2, 2) |
使用subplots方法能够直接创建画布 fig 和包含所有坐标轴的数组 axes 。
1 2 3 4 5 6 |
>>>axes array([[<matplotlib.axes._subplots.AxesSubplot object at 0x0000023862B4DBE0>, <matplotlib.axes._subplots.AxesSubplot object at 0x0000023862B78EF0>], [<matplotlib.axes._subplots.AxesSubplot object at 0x000002385FE79208>, <matplotlib.axes._subplots.AxesSubplot object at 0x000002385FEA34E0>]], dtype=object) |
可以很方便地调用每个坐标轴:
1 2 3 4 |
>>>ax1 = axes[0, 0] >>>ax2 = axes[0, 1] >>>ax3 = axes[1, 0] >>>ax4 = axes[1, 1] |
subplots方法中的参数如下:
参数 | 描述 |
---|---|
nrows | subplot的行数 |
ncols | subplot的列数 |
sharex | 所有subplot使用相同的x轴刻度 |
sharey | 所有subplot使用相同的y轴刻度 |
subplot_kw | 用于创建个subplot的关键字字典 |
**fig_kw | 创建figure时的其他关键字,如plt.subplots(2, 2, figsize=(8, 6)) |
代码演示:
1 2 3 4 5 6 |
>>>fig, axes = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True) >>>for i in range(2): ... for j in range(2): ... axes[i, j].hist(np.random.randn(500), bins=50, color='g', alpha=0.5) ... >>>plt.show() |
使用 nrows 和 ncols 参数指定了行列数,并且使用 sharex 和 sharey 参数共享了x轴和y轴的坐标,得到如下图形:
总结
使用 add_subplot 方法或 subplots 方法能够非常灵活地绘制图片。在以后的绘图过程中,都建议使用坐标轴实例的方法替代 plt 方法,能够让我们对绘图具有完全的控制权。