18

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

 3 years ago
source link: http://www.cnblogs.com/techflow/p/13683322.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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

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

Figure设置图像大小

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

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

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

vaiQvur.jpg!mobile

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

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

3QrmQfr.jpg!mobile

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

subplot与子图

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

plt.subplot

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

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

plt.subplot(2, 1, 1)
plt.plot(range(10))
plt.subplot(2, 1, 2)
plt.plot(x, y)
plt.show()

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

zUFBRjR.jpg!mobile

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

plt.plot(10)
plt.subplot(2, 1, 1)
plt.plot(range(10))
plt.subplot(2, 1, 2)
plt.plot(x, y)

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

figure.add_subplot

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

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

fig = plt.figure()
ax1 = fig.add_subplot(2, 1, 1)
ax2 = fig.add_subplot(2, 1, 2)

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

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

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

qmeuquZ.jpg!mobile

subplots

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

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

我们来看一个例子:

VFBZzu.jpg!mobile

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

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

原文链接,求个关注

- END -


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK