matplotlib中pyplot与axes的关系详解

江屿
江屿
发布时间:2026-10-13 | 6人浏览过
原创

本文深入解析matplotlib中pyplot接口与axes对象的关系。文章指出pyplot仅为接口而非对象,通过对比直接调用plt函数与实例化figure和axes对象两种绘图方式,详细说明了后者在对象管理、多子图绘制及代码可维护性上的优势,并提供了具体的代码示例与函数对照表。

引言:matplotlib核心概念梳理

近期在探索数据可视化领域,对pandas绘图、matplotlib核心机制、pyplot(即plt)以及axes等关键概念进行了系统梳理。

需明确三个核心要点:第一,axes并非axis;第二,axes不是axis;第三,axes不是axis。同时强调:pyplot是接口而非对象;pyplot是接口而非对象;pyplot是接口而非对象。

pyplot接口的本质与功能

许多教程开篇即展示import matplotlib.pypltot as plt并直接教授plt.xxx()的使用。这种写法虽无错误,但plt本质上只是一个interface(接口),甚至算不上一个完整的对象(回顾可知,用户从未实例化过名为plt类型的对象)。这种设计给对面向对象编程尚不熟悉的初学者带来了诸多困惑。plt接口的核心意义在于:

  • 允许用户通过接口直接进行绘图(此时可将该接口视为黑盒,无需关注内部具体的对象类型)。
  • 允许用户通过接口实例化其他类型的对象(例如figure类型或axes类型等)。

方法一:通过plt直接绘图

1. 通过plt.xxx()直接进行绘图操作。

正如各类教程和书籍中的常规操作所示,我们可以利用plt.plot()、plt.bar()等函数绘制不同类型的图表(部分常用函数总结如下表)。

表一:plt中用于绘图的部分函数列表。

函数名 作用
plt.bar() 条形图
plt.barh() 横排条形图
plt.boxplot() 箱线图(plt.box()是另一个函数)
plt.hist() 频率直方图
plt.plot() 折线图

我们可以利用plt提供的其他函数来设置图表标题等属性(部分常用设置函数总结如下表)。

表二:plt中用于设置的部分函数列表。

函数名 作用
plt.title() 设置图表标题
plt.grid() 设置图表网格
plt.xlabel();plt.ylabel 设置x;y轴标题
plt.xticks();plt.yticks() 设置x;y轴刻度
plt.xlim();plt.ylim() 设置x;y轴范围
plt.annotate() 设置标注

(具体的参数说明和用法详情,请参阅 https://matplotlib.org/api/pyplot_summary.html )。

使用plt进行绘图既便捷,也是其最令人困惑之处,因为它缺乏显性的对象标识。我们甚至可以在调用pandas绘图后,利用表二中的plt函数对pandas生成的图表进行后续设置。

具体例程如下:


import matplotlib.pyplot as plt
from pandas import Series
data = Series([1.47,1.62,1.78,1.94,2.38,2.60],index=['2012','2013','2014','2015','2016','2017'])
#注意下一行的对象是'data',它是一个series对象,调用的是pandas绘图函数
data.plot(label='income', color = 'r', linestyle=':', marker = 's')#具体的pandas绘图之后会细讲
#但接下来我们甚至可以调用plt的函数对它进行设置
plt.title('Income chart')
plt.xlabel('Year')
plt.ylabel('income')
plt.annotate('Largest point',xy=(5,2.60),xytext=(3,2.5), arrowprops=dict(arrowstyle='->'))
plt.show()

上述示例展示了pyplot(plt)的特点:无需指定具体对象即可进行绘图和设置。当程序中图表数量较少时,这种方式十分便捷;然而,当同一程序中图表较多时,这种缺乏显性对象的方式会导致无法重新调用之前的图表(因为缺少对象名),且容易给人带来不稳定的感觉。

方法二:实例化figure与axes对象

2. 实例化figure和axes对象后进行绘图。

如前文所述,plt仅是一个接口,并非对象。在matplotlib中,存在两个重要的对象类型:figure对象可视为一张空白图纸,在其上可以绘制一个或多个axes对象(以及其他辅助对象)。axes对象则是图像的主要组成部分(包含了图线、xy轴等元素)。我们可以使用plt接口生成figure对象和axes对象,随后对axes对象调用相应方法来实现绘图和设置。总体思路如下:

  1. 第一步,实例化figure对象。
  2. 第二步,实例化axes对象。
  3. 第三步,对axes对象调用方法进行绘图和设置。

具体例程如下:


import matplotlib.pyplot as plt
from pandas import Series
data = Series([1.47,1.62,1.78,1.94,2.38,2.60],index=['2012','2013','2014','2015','2016','2017'])
#调用plt接口,实例化figure1对象
figure1 = plt.figure(facecolor='w')#faceclolr设置背景颜色
#实例化ax1对象
ax1 = figure1.add_subplot(111)#ax1是figure1的第1行第一列的第1张图表
#注意下一行的对象是'ax1',它是一个axes对象,调用的是matplotlib.axes绘图函数
ax1.plot(data,label='income', color = 'r', linestyle=':', marker = 's')
#接下来我们调用ax1的方法对它进行设置
ax1.set_title('Income chart')
ax1.set_xlabel('Year')
ax1.set_ylabel('income')
ax1.annotate('Largest point',xy=(5,2.60),xytext=(3,2.5), arrowprops=dict(arrowstyle='->'))

采用这种方式绘制的图表,每个对象都拥有独立的名称,便于后续继续调用和修改。虽然代码增加了两行实例化语句,但并未显著增加复杂度。个人更倾向于使用这种方式绘图(同时也给人一种更加稳妥的感觉)。

plt与axes函数对比分析

类比前述表一和表二,现给出针对axes对象的方法函数对照表:

表三:axes对象用于绘图的部分方法函数列表。

函数名 作用
ax.bar() 条形图
ax.barh() 横排条形图
ax.boxplot() 箱线图
ax.hist() 频率直方图
ax.plot() 折线图

表四:axes对象中用于设置的部分方法函数列表。

函数名 作用
ax.set_title() 设置图表标题
ax.set_xlabel(); ax.set_ylabel 设置x;y轴标题
ax.set_xticks(); ax.set_yticks() 设置x;y轴刻度
ax.set_xlim(); ax.set_ylim() 设置x;y轴范围
ax.annotate() 设置标注

(具体的参数说明和用法详情,请参阅 https://matplotlib.org/api/axes_api.html )。

请注意对比表一与表三、表二与表四的异同点:

  1. 表一和表二中的plt名称是固定的,无论绘制何种图表均使用plt.xxx();而表三和表四中ax.xxx()的ax部分需替换为你实际实例化的对象名称。
  2. 对比表二和表四可以发现,许多功能相同的操作,在axes对象中需要额外添加set_前缀。

总结与展望

使用实例化axes的方式进行绘图至关重要,因为多子图的绘制更依赖于axes对象的支持。

后续我将分两期分别介绍axes与多子图绘制、以及axes与pandas绘图之间的关系。

至此,关于浅谈matplotlib.pyplot与axes关系的文章介绍完毕,更多相关matplotlib.pyplot及axes内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表