[机器学习实战札记] matplotlib绘图基础

时间:2022-05-20 21:26:41

在机器学习中,通常会涉及到大量的数据。如果直接观看这些原始数据,很难从中看出有用的信息。人类是非常视觉的生物,当我们看到可视化的东西时,会更好地理解事物。在python中,有一个强大的工具matplotlib来帮助我们,用图形化的方式来展现数据。在《机器学习实战》一书中,就多处使用了matplotlib来绘制图形,帮助我们理解数据和学习算法。

初看起来,当你开始使用这个Python数据可视化库绘制图形时,似乎有很多组件需要考虑。事实上,这个库非常灵活,并且有很多内置默认设置,不需要写很多代码就可以完成图形绘制。让我们从一个简单的示例开始:

# 导入必要的包和模块
import matplotlib.pyplot as plt
import numpy as np

# 产生0~10之间间隔均匀的100个数字序列
x = np.linspace(0, 10, 100)

# 绘制序列
plt.plot(x, x, label='linear')

# 添加图例
plt.legend()

# 显示图形
plt.show()

示例展示了matplotlib绘图的步骤:
1. 导入matplotlib相关库
2. 准备数据
3. 使用plot()函数开始绘图
4. 使用show()函数显示图形。

运行结果如下:

[机器学习实战札记] matplotlib绘图基础

是不是很简单!不过,如果我们不满足于绘制这种简单的图形,那就需要对matplotlib做更深入的了解。一个比较完整的matplotlib图形如下所示:

[机器学习实战札记] matplotlib绘图基础

一个matplotlib图形主要有两大组件:

  • 图(Figure)是绘制所有内容的整个窗口或页面,它是所有的对象的顶层组件。你可以创建多个独立的图。图可以有其他的东西,比如suptitle,它是图的中心标题。你也可以将图例(legend)和颜色条(color bar)添加到图中。
  • 在图上,你可以添加坐标轴(Axes)。坐标轴是plot()和scatter()等函数绘制的区域,可以包含与其相关的刻度(tick)、标签(label)等。图可以包含多个坐标轴。

你可能会疑惑了?在示例1中,既没有Figure,也没有Axes对象。这就是matplotlib的灵活之处,通常默认的配置就可以完成图形绘制。下面看一个稍微复杂的例子:

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)
ax.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], color='darkgreen', marker='^')
ax.set_xlim(0.5, 4.5)
plt.show()

绘制出来的图形如下:

[机器学习实战札记] matplotlib绘图基础

每个坐标轴都有一个x轴和一个y轴(这句话有点难以理解,主要是因为在英语中Axes和Axis都翻译为轴,其实Axes可以理解为子图),它们包含刻度,刻度包含主要和次要的刻度线和刻度标签。如果你要绘一个特别的坐标轴,还有坐标轴标签、标题和图例,以及坐标轴比例和网格线要考虑。

子图

这个是matplotlib中最不容易理解的。首先是我们为什么需要它?因为有时候我们需要将不同的数据视图并排进行比较。为此,Matplotlib引入了子图的概念:可以在一个图中存在多组较小的坐标轴。还是用例子加以说明:

import matplotlib.pyplot as plt
plt.style.use('seaborn-white')
import numpy as np
ax1 = plt.axes()  # standard axes
ax2 = plt.axes([0.65, 0.65, 0.2, 0.2])
plt.show()

代码使用了最基本方: plt.axes函数。使用默认参数时,会创建一个填充整个图形的标准轴对象。 代码中ax2使用了可选参数,含义是图形坐标系中的[left,bottom,width,height],范围从图左下角的0到图右上角的1。例如,比如示例中x和y位置为0.65,指的是从宽度和高度的65%开始,宽和高的范围为0.2,表示坐标轴的大小为图的宽度和高度的20%。

显示的图形如下:

[机器学习实战札记] matplotlib绘图基础

你可以尝试一下修改0.2为0.5,就可以发现第二个子图超出了显示范围。

当然更常见的形式方法是fig.add_axes(),上面的代码可以改写为:

fig = plt.figure()
ax1 = fig.add_axes()
ax2 = fit.add_axes([0.65, 0.65, 0.2, 0.2])
plt.show()

python是如此灵活,绘制子图还可以通过subplot来实现,比如在<<机器学习实战>>一书中,有多处plt.subplot(111)之类的代码,这又是什么含义呢?

其实,plt.subplot(111)与plt.subplot(1, 1, 1)等价,前两个的含义是,将图想象为1x1的网格,最后一个参数表示网格的第1个子图。所以就是这个代码就是坐标轴布满整个图。还是以2x2网格举例说明更容易理解一些,比如如下的代码:

fig = plt.figure()
fig.add_subplot(221)   #top left
fig.add_subplot(222)   #top right
fig.add_subplot(223)   #bottom left
fig.add_subplot(224)   #bottom right 
plt.show()

可以形象的用下面的图表示,有助于理解:

[机器学习实战札记] matplotlib绘图基础

聪明的你应该可以想到下面的代码会绘出怎样的图形了吧?

fig = plt.figure()
fig.add_subplot(221)   #top left
fig.add_subplot(224)   #bottom left
plt.show()

对了,绘制的是第一个和第四个子图:

[机器学习实战札记] matplotlib绘图基础

当然,要绘制一个实用的图,仅仅掌握这些函数还不够。不过如果把基础的概念弄清楚以后,具体到某个函数调用,查在线手册就可以了。

参考

  1. Matplotlib Tutorial: Python Plotting
  2. MatPlotlib 中文手册
  3. https://*.com/questions/3584805/in-matplotlib-what-does-the-argument-mean-in-fig-add-subplot111
  4. Multiple Subplots