【基本工具】S02E20 matplotlib数据可视化之绘制子图

0.本集概览

1.一般化的子图布局及绘图
2.用plt.subplot/subplots方法绘制子图
3.子图之间共用坐标轴的用法
4.GridSpec绘制不规则多行多列子图的方法及举例

今天我们深入的探讨一下子图的有关内容。

有时候我们需要从多个角度进行数据的比较、分析,因此就需要用到子图。子图的本质是在一个较大的图形中同时放置一组较小的坐标轴,布局形式可以多种多样,不拘泥于我们在第五集中举的那种网格图的形式。

1.一般化的子图布局

我们先进行一般化的子图布局。

首先要创建各个子图的坐标轴,传入一个四元列表参数:[x,y,width,height],用来表示这个子图坐标轴原点的x坐标、y坐标,以及宽和高。值得注意的是,这四个值的取值范围都是$[0,1]$,我们约定整个大图的左下端为原点$(0,0)$,右上端为$(1,1)$。那么$x,y$的取值就表示该子图坐标原点的横坐标值和纵坐标值占大图整个长宽的比例。而$width$和$height$则表示子图的宽和高占整个大图的宽和高的比例。如果不传入参数则表示选取默认坐标轴,即大图的坐标轴。

import numpy as np
import matplotlib.pyplot as plt

ax1 = plt.axes()  
ax2 = plt.axes([0.5, 0.6, 0.15, 0.25])
plt.show()


下一步,我们就要在子图中进行绘图了,每生成一个子图坐标系,plt就表示当前的子图,调用plt.plot就是在当前的子图上进行绘图。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10)
plt.axes([0.1, 0.5, 0.8, 0.4], ylim=(-1.2, 1.2))
plt.grid(True)
plt.plot(np.sin(x))

plt.axes([0.1, 0.1, 0.8, 0.4], ylim=(-1.2, 1.2))
plt.grid(True)
plt.plot(np.cos(x))
plt.show()

2.用plt.subplot/subplots方法绘制子图

这时候,我们很自然的回忆起我们所使过用的plt.subplot方法,和上面有所不同的是,subplot方法无法绘制比例自定义的子图,而是只能创建彼此对齐的行列网格子图,如果仅仅是这种需求的话,倒是使用起来非常简便:

import numpy as np
import matplotlib.pyplot as plt

plt.subplots_adjust(hspace=0.3, wspace=0.3)
for i in range(1,7):
    plt.subplot(2,3,i)
    plt.text(0.5,0.5,str((2,3,i)),fontsize=18,ha='center')
plt.show()

这个用法非常简单和直观,着重说一下plt.subplots_adjust这个方法,他设置了子图之间的纵、横两方向上的间隙,然后子图中的文本就是他的编号规则。

3.子图之间共用坐标轴的用法

但是有没有一种感觉,就是这里面的子图显得非常拥挤,因为每个子图都有自己的一套独立的坐标轴,如果这些子图的坐标轴的取值都是一样的,那我们能否让他们同方向上公用,用以简化图形的描述呢,当然可以。

我们下面介绍子图间坐标轴的共用。
```
import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots(2,3,sharex='col',sharey='row')
print(ax)
plt.show()

[[

top Created with Sketch.