matplotlib入门基础(一)figure相关的基本概念以及创建一个图

开一个新的系列,分享一些学习matplotlib的经验,帮助初学者理解一些最基本的概念。

我自己曾经认为只要会用matplotlib画出一张图就行了,不用管那么多,然而不断接触matplotlib,遇见的问题也就越来越多,最主要的疑惑就是,好像有很多函数都可以实现同一个功能,我该用哪个函数?如果你也是不管三七二十一,上来就用plt.xxx(),也许这个系列的博客可以帮助你对matplotlib有更全面一点的认识。这个系列的博客偏向于对基础用法的总结,不会是单纯的函数API文档翻译,用于matplotlib的入门。

这篇文章分以下部分来介绍:
1. 官网/版本
2. figure/axes/图元素
        2.1 figure/axes/图元素的简介
        2.2 创建一个图
3. 面向对象风格和pyplot风格

1. 官网/版本

大致可以分为旧版官网新版官网

旧版官网:(页面顶部呈现红色橙色),例如

旧版官网包含1.0版、2.0版、含3.4版之前的3.0版
例如:
https://matplotlib.org/1.4.0
https://matplotlib.org/2.0.0
https://matplotlib.org/3.0.0

新版官网:(白色),例如

新版官网包含3.5版之后的版本
例如:
https://matplotlib.org/3.5.0
https://matplotlib.org/stable(目前最新的)

可以自己修改网址中的版本号以进入对应版本的官网
旧版和新版的教程和示例等等不完全一样,都可以学习。
不同版本API函数可能也有小区别,参数也有少量不同。

2. figure/axes/图元素

网上可以经常看到如下两张示意图

来源于1.0版的官网,例如:Usage — Matplotlib 1.5.0 documentation

来源于最新版官网:Basic Usage — Matplotlib 3.5.2 documentation

上述两张图已经注明来源,这一节以上面两张图为基础,介绍figure、axes、图元素这三项内容。

2.1 figure/axes/图元素的简介

figure、axes、图元素是三个matplotlib画图最基本的概念,几乎所有的matplotlib图都会用到,这里给出简单总结:
figure:图的全部,例如,上面第一张图,就是一个figure,第二张图,也是一个figure
axes:附加于figure上的绘制数据的区域,这个区域不一定是可见的,例如,第一张图里的蓝色方框代表的区域
图元素:每个axes可以画的内容,包括坐标轴xaxis和yaxis、x轴和y轴的刻度tick、轴标签xlable和ylable、图的标题title、图上的数据曲线等等元素,例如,第二张图里的各种元素
(参考:Basic Usage — Matplotlib 3.5.2 documentation

关于三者的关系,其实上面两张示意图已经描述清楚了。三者的关系,可以理解为,figure是一张画板,axes是固定在画板上的A4纸,每张A4纸都可以画一幅画,每幅画上包括坐标轴、数据曲线等等多种图元素只是个人理解,每个人可以按照不同的方式理解)。同时,一个figure可以包含多个axes(好比一张画板可以固定多张A4纸),每个axes画各自的内容(每张A4纸单独作画,作画的内容之间没有联系)。

2.2 创建一个图

以创建figure,创建axes,用axes画图这三个步骤,贴出一段基础画图代码

import matplotlib.pyplot as plt

x = [1,3,5,7]
y = [4,9,6,8]

# 创建figure
# 其他参数参考官网
# 扩展参数:Figure属性参数
figure = plt.figure(num='this is a figure',
                    figsize=(3.0, 3.0), #图的大小,默认: [6.4, 4.8]inches
                    )
# 创建axes
axes = figure.add_subplot(1,1,1) #default: (1, 1, 1),表示行数、列数、索引
# 用axes画图
axes.plot(x,y)

plt.show() #创建的figure显示出来

其中plt.figure()函数只设置前两个参数,num和figsize,num表示figure的名字,figsize表示figure的尺寸。其余参数参考官网,此外,plt.figure()函数还可以设置Figure属性参数作为扩展参数。
(plt.figure()函数完整参数参考官网:matplotlib.pyplot.figure — Matplotlib 3.5.2 documentation

 执行可以得到以下图片,图中已经注释所设置的参数对应的效果

如果不考虑figure的名字和尺寸,仅仅画图,那么上面的一段代码等效于

import matplotlib.pyplot as plt

x = [1,3,5,7]
y = [4,9,6,8]

# pyplot函数用法
plt.plot(x,y)

plt.show() #创建的figure显示出来

这段代码虽然没有创建figure和axes,但是plt.plot()函数会创建默认的figure和axes,并在默认的axes上画图。

3. 面向对象风格和pyplot风格

matplotlib库的发明初衷就是为了模仿 MATLAB 的绘图功能,而python是面向对象的语言,所以用matplotlib库编程包含两种代码风格:
风格1. 显式创建figure和axes,并调用axes的函数(面向对象object-oriented(OO)风格)。
风格2. 依靠 pyplot 自动创建figure和axes,调用pyplot的函数(pyplot风格)

其中,风格1为面向对象风格,主要调用matplotlib的axes模块里的函数,例如第2节中的第一个代码段
(matplotlib的axes模块:matplotlib.axes — Matplotlib 3.5.2 documentation
风格2为模仿MATLAB的代码风格,主要调用matplotlib的pyplot模块里的函数,例如第2节中的第二个代码段
(matplotlib的pyplot模块:matplotlib.pyplot — Matplotlib 3.5.2 documentation

而对于两种代码风格,各个官方版本都有展示对于两种代码风格的观点
例如2.2.0版:
While it is easy to quickly generate plots with the matplotlib.pyplot module, we recommend using the object-oriented approach for more control and customization of your plots.
(来源:The Pyplot API — Matplotlib 2.2.0 documentation
例如3.0.0版:
At its core, Matbplotlib is object-oriented. We recommend directly working with the objects, if you need more control and customization of your plots.
(来源:API Overview — Matplotlib 3.0.0 documentation
例如3.5.0版:
Matplotlib's documentation and examples use both the OO and the pyplot approaches (which are equally powerful), and you should feel free to use either (however, it is preferable pick one of them and stick to it, instead of mixing them)
(来源:Usage Guide — Matplotlib 3.5.0 documentation
例如最新版:
Matplotlib's documentation and examples use both the OO and the pyplot styles. In general, we suggest using the OO style, particularly for complicated plots, and functions and scripts that are intended to be reused as part of a larger project. However, the pyplot style can be very convenient for quick interactive work.
(来源:Basic Usage — Matplotlib 3.5.2 documentation

根据以上标注信息,可以看出,官方虽然在3.5.0版中提出两种代码风格等效(equally powerful),但是更多版本中都更推荐使用面向对象风格

另外,查看pyplot模块的源文件可以发现,大多数pyplot函数xxx()的内部其实是gca().xxx(),gca()表示获取当前的axes,说明大多数pyplot函数xxx()其实本质上仍然是调用axes模块里对应的函数,大多数pyplot函数xxx()和axes模块里对应的函数其实是一回事。

因此,编程时应当尽量使用面向对象风格,显式创建并控制figure和axes对象,避免无脑使用plt.xxx()。

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值