matplotlib绘制多个自定义子图在一张图上

1年前 ⋅ 564 阅读

如何使用python的matplotlib绘制多子图的图片?首先我们来看看最终的结果:
lastresult.png
操作步骤有如下几步:
第一步:导入包。 这里需要使用到三个模块matplotlib、numpy、pandas,导入这三个包的代码如下:

import matplotlib.pyplot as plt  #是画图的核心
import numpy as np				 #使用到其中数组相关的模块
import pandas as pd				 #使用到其中序列化对象

注意:如果这里缺少相关模块,笔者这里缺少pandas这个模块,如果有软件提示,按照软件提示安装相应的模块,如果没有提示,直接打开cmd窗口,使用pip3 install xxxxx安装相应的模块,xxxxx代表对应的模块名称,比如我这里安装的代码是pip3 install pandas
安装完对应的模块,我们继续到画多个子图中来。
第二步,设置行数和列数。首先,我们要设置展示的子图行数和列数,比如我们要展示两行两列的子图,示例代码如下:

fig, axes = plt.subplots(nrows=2, ncols=2)  #设置展示的图的行数,列数量,这里是2*2的图

第三步,接下来,我们就要准备数据

data1 = pd.Series(np.random.rand(6), index=list("123456")) #这里创建一组数据,用来展示到指定的图上

生成的data1数据的具体情况如下:

1    0.079807
2    0.407609
3    0.414676
4    0.771615
5    0.096824
6    0.009974

看到这里是不是有点懵,笔者准备了一组对照的数据帮助理解

    data2 = pd.Series([0, 1, 2, 8], index=list(['first', 'sec', 'thir', 'fourth'])) #这里创建一组数据,用来展示到指定的图上
    data3 = pd.Series([0, 1, 2, 8], index=list(['first', 'sec', 'thir', 'fourth'])) #这里创建一组数据,用来展示到指定的图上

生成的data2的数量如下:

first     0
sec       1
thir      2
fourth    8

仔细对照上面两种数据情况,简单理解下pd.Series(y,x)这个函数,前面的[0, 1, 2, 8]、np.random.rand(6)表示两个图中每个x轴的值对应的取值,而index=list(['first', 'sec', 'thir', 'fourth'])则就是我们x轴的每个刻度。
第四步:绘制图像。好了,x轴和y轴数据准备好后,我们就将这几个数据绘制到我们想要展示的位置中去。绘制代码如下:

    data1.plot.bar(ax=axes[0, 0], color='b', alpha=0.5) #在0,0位置上画图,颜色为蓝色
    data2.plot.bar(ax=axes[0, 1], color='g', alpha=0.5) #在0,1位置上画图,颜色为绿色
    data3.plot.bar(ax=axes[1, 0], color='g', alpha=0.5) #在1,0位置上画图,颜色为绿色

其中ax=axes[0, 0]表示在两行两列的坐标轴上的[0,0]位置绘制我们第一个数据(data1)的图,color='b'表示绘制蓝色的图。笔者这里没有绘制[1,1]的图,要想绘制,自己补充就行。
第五步:接下来就是展示你绘制图的代码:

    plt.show() #必须要有,不然不展示图片

结果如下图:
mutil-plot.png
注意: 但是,我们发现一个问题,第一行x轴有部分类容展示不出来,如下图标识部分: mutil-plot-error.png
那么我们需要调整一下距离,代码如下:

    plt.tight_layout() #调整子图间的距离

最后的代码如下:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

fig, axes = plt.subplots(nrows=2, ncols=2)  #设置展示的图的行数,列数量,这里是2*2的图

data1 = pd.Series(np.random.rand(6), index=list("123456")) #这里创建一组数据,用来展示到指定的图上
data2 = pd.Series([0, 1, 2, 8], index=list(['first', 'sec', 'thir', 'fourth'])) #这里创建一组数据,用来展示到指定的图上
data3 = pd.Series([0, 1, 2, 8], index=list(['first', 'sec', 'thir', 'fourth'])) #这里创建一组数据,用来展示到指定的图上
print(data1)
print(data2)
data1.plot.bar(ax=axes[0, 0], color='b', alpha=0.5) #在0,0位置上画图,颜色为蓝色
data2.plot.bar(ax=axes[0, 1], color='g', alpha=0.5) #在0,1位置上画图,颜色为绿色
data3.plot.bar(ax=axes[1, 0], color='g', alpha=0.5) #在1,0位置上画图,颜色为绿色
plt.tight_layout() #调整子图间的距离
plt.show()

结果图如是:
lastresult.png