matplotlib | Python强大的作图工具,让你从此驾驭图表(二)

2020-08-27 00:00:00 创建 对象 图像 调用 绘制

今天是数据处理专题的第10篇文章,我们继续来聊聊matplot这个工具库。

在上周的文章当中我们介绍了matplot的基本用法,以及展示了一些简单的例子,让大家直观地了解这个工具包。我们可以简单地将它理解成专门用来作图的工具,但是它作图的功能又非常强大,以至于并不能当成一个简单的内容来对待。道理也很简单,老板让你去做一份数据出来,结果你画出来的图啥也没有,也不知道什么颜色代表什么内容,也没有标题,难以阅读,显然这是不行的。

所以我们还需要深入学习它的一些用法, 让我们做出来的图更加的直观,展示更多的信息,也更加美观。


Figure设置图像大小

首先我们来介绍一个很重要的概念,叫做Figure。Figure是matplotlib的核心对象,可以理解成所有我们画出来的图像的数据都存在figure对象当中。其实这个概念非常直观,因为在英文当中figure本身就有图像的意思,当然它还可以指一个人的身材,扯远了……

在计算机领域当中类似的概念有不少,如果我们不知道它的英文意思,可能会觉得这些概念都很费解,这边一个概念,那边一个概念,有时候如果能够了解一下它对应的英文原意,也许会发现些惊喜,让你理解更加顺畅。

figure简单的用法就是设置matplotlib绘制出来图片的大小,我们用sigmoid函数图像举例,我们正常画出来的图像是这样的:

由于图片会有缩放,所以大家可能很难直接从文章的图片上看出它的大小,但是至少我们是可以看出来这是一个长方形的图像。如果我们想要将它绘制成正方形呢?或者是我们想要控制它的大小,让它画得长一些或者是宽一些或者是单纯地大一些呢?

这时候我们就需要用到figure了,我们可以在figure当中通过figsize这个参数来设置它的大小。比如我们用下面这些代码绘制出来的图像就变了:

即使看不出来大小,但是我们也可以看得出来图片变成了正方形。原因是因为我们传入的size是一个(5, 5)的tuple,这里的5的单位是英寸。也就是说我们通过参数设置,可以使得绘制出来的图像按照我们想要的大小展示,并且可以保证不论在什么设备上看到的结果都是一样的。

subplot与子图

有的时候我们希望把一系列图表合并在一起,拼成一张大图,这样的话会更加方便我们观看,可以一次性获取更多的信息。对于这个问题有好几个解决方案,我们一个一个来看。

plt.subplot

首先,我们可以使用plt.subplot方法,subplot顾名思义就是子图的意思。这时候我们传入三个数,前面两个参数表示我们后想要得到的大图的情况。比如说我们希望后的大图是由两行一列的小图组成的,那么我们就传入2,1。第三个参数表示当前绘制的是第几个小图。

这里隐藏的重点是我们绘制多个子图的时候是一个一个绘制的,小图的摆放形式非常类似于二维数组。我们来看一个例子:

plt.subplot(211)
plt.plot(range(10))
plt.subplot(212)
plt.plot(x, y)
plt.show()

可以看到我们一共调用了两次plot方法,每一次调用之前都先调用了subplot申明了当前plot的是第几个子图。这样我们得到的结果就是由两行一列不同图像组成的大图。

关于subplot有一点需要注意,如果我们在调用subplot之前也调用了plot,那么我们plot的内容会被清除。比如说我们在subplot之前再多调用一次plot,得到的结果是一样的。

plt.plot(10)
plt.subplot(211)
plt.plot(range(10))
plt.subplot(212)
plt.plot(x, y)

因为我们调用subplot的时候清除了当前figure当中已经有的内容,所以还是只能看到上面的结果。

figure.add_subplot

上面一种方法的好处是用起来非常方便,我们只需要不停地调用subplot就可以了,但是坏处是会清除之前残留的图像,还有就是不是非常直观。虽然所有操作都通过plt进行非常方便,但是对于初学者而言要记住这么多api并不是一件容易的事情。

所以这里我们还有另外一种方法,这一种方法要直观很多,也更加符合我们日常编程的习惯。这个方法就是通过figure调用add_subplot。也就是我们先创建figure对象之后,再往figure当中添加子图。我们同样来看个例子:

fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)

ax1.plot(range(10))
ax2.plot(x, y)
plt.show()

在这段代码当中我们先创建了一个figure对象,然后再通过这个figure对象创建了两个subplot对象。后我们对于每一个subplot对象单独绘制,这样整个过程更加得顺滑,和我们理解的面向对象的思想更加接近。还有一点就是它会保留创建子图之前的改动。

如果我们在这段代码之前加上plt.plot(range(10))的话,那我们看到的结果会是这样的:

subplots


后一种方法是subplots,它是第二种方法的进化。我们在使用第二种方法的时候有没有一种觉得很麻烦的感觉?因为我们要先创建figure,再通过figure创建subplot。我们后操作的对象是subplot,既然如此,为什么我们不能直接创建出subplot对象来呢?

所以plt当中提供了subplots方法可以直接创建出figure和subplot对象,我们只需要传入我们希望得到的子图的长和宽即可。由于子图会有多个,所以返回的结果会自动存入一个二维数组当中,我们只需要用数组的形式去访问它即可。

我们来看一个例子:

关于figure和subplot的基本用法就介绍完了,当然除了今天介绍的内容之外,还有很多其他的用法,这些就留到之后的文章介绍吧。

今天的文章到这里就结束了,如果喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、在看、点赞)。


相关文章