Matplotlib中的plt和ax都是啥?

这篇文章先介绍一下 Matplotlib 的一些简单基本概念和绘图原理,直入正题~

不知道有多少同学和我一样,在刚接触 Matplotlib 时,会被书上的 pltax 以及 subplots 等各种概念所迷惑,心里存在无数个问号,这些究竟是啥?画出来的图不是一样的吗?他们有啥区别?下面就一步步来解答这些迷惑。

概念引入

首先,我们应该要了解一张用 Matplotlib 画出来的图的具体构造,引用一张官方的图:

我们先主要看图里面红色框的 Figure 和蓝色框的 Axes ,如何理解这两个东西呢?

如果将 Matplotlib 绘图和我们平常画画相类比,可以把 Figure 想象成 一张纸 (一般被称之为画布), Axes 代表的则是 纸中的一片区域 (当然可以有多个区域,这是后续要说到的 subplots ),上一张更形象一点的图。

Figure 画布中, Axes1 区域画了一张数据仪表盘, Axes2 区域画了柱状图, Axes3 区域绘制了一张地图,相信还是挺好理解的。

两种绘图方式区别

对着两个概念有基本的了解后,就可以来看看 plt.plot()ax.plot() 有何区别了,下面列出了两种用 Matplotlib 绘制图表的方式。

  • plt

# 第一种方式
plt.figure()
plt.plot([1,2,3],[4,5,6])
plt.show()
  • ax

# 第二种方式
fig,ax = plt.subplots()
ax.plot([1,2,3],[4,5,6])
plt.show()

绘图效果如下

可以看到,不论是用 plt.plot() 还是 ax.plot() ,结果都是一样的

那区别在哪里?

从第一种方式的代码来看,先生成了一个 Figure 画布,然后在这个 画布上隐式生成一个画图区域进行画图

第二种方式同时生成了 Figureaxes 两个对象,然后用 ax 对象在 其区域内 进行绘图

如果从 面向对象编程 (对理解 Matplotlib 绘图很重要)的角度来看,显然第二种方式更加易于解释,生成的 figax 分别对画布 Figure 和绘图区域 Axes 进行控制,第一种方式反而显得不是很直观,如果涉及到子图 零部件的设置 ,用第一种绘图方式会很难受。

在实际绘图时,也更 推荐使用第二种方式。

subplot的绘制

下面通过介绍 subplots 加深对第二种绘图方式的理解

假如现在我要在一张纸上左边画一个折线图,右边画一个散点图,该如何画呢?

首先要有一个画布 Figure ,其次,需要有两个区域 Axes (等价于两个子图 subplot )来画图

# 生成画布和axes对象
# nrows=1和ncols=2分别代表1行和2列
fig,ax = plt.subplots(nrows=1,ncols=2)

因为这里有两个画图区域,所以 ax 对应的是一个列表,存储了两个 Axes 对象。

然后分别控制左边和右边的绘图区域进行绘图

fig,ax = plt.subplots(nrows=1,ncols=2)
ax[0].plot([1,2,3],[4,5,6])
ax[1].scatter([1,2,3],[4,5,6])

其实到这里了也会发现,一个 Axes 对象对应了一个 subplot 子图,这些个子图都是画在同一个画布 Figure 之上。

读到这里可能已经对 Matplotlib 绘图有点感觉了,下一篇系列文章会接着介绍 Matplotlib 常见组件的设置,有什么疑问可以点下面的的链接给我留言!

往期文章

Pandas时间序列数据操作

70G上市公司定期报告数据集

5个小问题带你理解列表推导式

文本数据清洗之正则表达式

Python网络爬虫与文本数据分析

综述:文本分析在市场营销研究中的应用

如何批量下载上海证券交易所上市公司年报

Numpy和Pandas性能改善的方法和技巧

漂亮~pandas可以无缝衔接Bokeh

YelpDaset: 酒店管理类数据集10+G