前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[机器学习实战札记] matplotlib绘图基础

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

作者头像
云水木石
发布2019-07-01 14:43:52
1.2K0
发布2019-07-01 14:43:52
举报

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

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

代码语言:javascript
复制
# 导入必要的包和模块
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图形主要有两大组件:

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

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

代码语言:javascript
复制
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()

绘制出来的图形如下:

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

子图

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

代码语言:javascript
复制
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%。

显示的图形如下:

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

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

代码语言:javascript
复制
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网格举例说明更容易理解一些,比如如下的代码:

代码语言:javascript
复制
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()

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

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

代码语言:javascript
复制
fig = plt.figure()
fig.add_subplot(221)   #top left
fig.add_subplot(224)   #bottom left
plt.show()

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

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

参考
  1. Matplotlib Tutorial: Python Plotting
  2. MatPlotlib 中文手册
  3. In Matplotlib, what does the argument mean in fig.add_subplot(111)?
  4. Multiple Subplots
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云水木石 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 子图
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档