【matplotlib绘图】别再用pyplot (plt) 画图了!因为他跟你一样:没 有 对 象!

Laurie ·
更新时间:2024-09-20
· 553 次阅读

对象!对象!对象!重要的事情说三遍!
即便你没有对象,在python里万物皆对象!

如果你要做数据分析,拿到一个数据,想要快速地画出一张图给一个直观印象;或是你只是想为你的文章数据加一个图表,并没有复杂且奇怪的要求的话,plt是你很好的选择,简洁,快速。

但是如果你在一个程序里面要画好几张图(无论是多张单个的图表还是多子图)或者对画出来的图表有这复杂而苛刻的要求的话(没错,说的就是我们这种上数据分析课的,各种题目有各种复杂而且奇怪的要求的情况。),那么请务必不要用plt画图!

plt画图存在的问题

因为pyplot模块只是一个接口,所有的操作没有一个显性的对象,既然我们说了,在python里万物皆对象,那么plt所面向的对象究竟是什么呢?是它创建的没有名字的默认对象。这就带来了三个问题(其实说到底是一个问题):

你不知道你画出来的图的对象名 我不能指定对象进行操作 直接使用plt.xxx的时候,它作用的对象可能并不是我想要的

举例来说:
在Jupyter Notebook中,我用plt画了一张图,在下一个cell中我又想把它保存下来,但是生成的图片却是空白的(从0 Axes就可以看出它并没有保存任何的东西,并且保存的图片的确实是空白的
在这里插入图片描述

这就是因为我这一条plt指令和上一条plt指令不在同一个cell中,他们的默认对象没有被传递下来。
如果用plt画图的话,唯一的解决办法就是把这几条指令放在同一个cell中
如果说这还可以忍受的话,那么假设在你的程序里要画A、B两张图,如果用plt画图的话,必须先把A图画出来,各种设置调好,保存好(并且还都得在同一个cell中完成,不得有任何闪失)以此类推再去画B图。注意,我们画A、B两张图的时候,都用的是plt.xxx,代码没有任何的区别,你和程序区分这两张图的唯一方法就只有顺序的区别。这时,你不能返工再去调整A图,因为你无法调用A图,你连它的名字都不知道,又从何告诉电脑“我要修改的不是B图而是上面那张A图”呢?
不仅如此,由于plt中的默认对象,在不同的环境中可能会出现代码运行报错,代码效果无法复现,甚至连BUG都无法复现的问题(同样一段代码,在我这里没问题,在你那里就不行)

解决方法

所以,我极力推荐先实例化figureaxes对象,然后对axes对象调用方法来实现画图和设置。
在matplotlib中,有两个重要的对象类型:figure对象可以把它想成一张空白图纸,在上面可以绘制一个或多个axes对象(还可以有其他对象等)。axes对象是一个图像的主要部分(它包括了图线、xy轴等部分)。
我们可以使用plt接口生成figure对象和axes对象,然后对axes对象调用方法来实现画图和设置。
总体思路是:

实例化figure对象 实例化axes对象 对axes对象调用方法进行画图和设置

相同的例子:
在这里插入图片描述
我们实例化figure1对象,并且我们在figure1下生成它的ax1对象。
从上面的截图我们可以看到,即便是在不同的cell里面,调用figure1savefig()方法也是可行的,生成了我指定的fig1.jpg文件
这就是面向figureaxes对象来画图的好处之一。

现在我们就能来解决之前提出的同时画A、B两张图的问题了。
在这里插入图片描述
我们先实例化了三个figure对象(figure1,figure2,figure3),在每个figure对象下都分别有一个axes对象(xa1,ax2,ax3)。
在画xa1,ax2的时候,我们的对象是axes,方法是plot()bar()来绘制折线图和柱状图。
在画ax3的时候,我们的对象是data(它是Series类型),方法是plot()来绘制柱状图。
(注意因为对象类型不同,他们的方法名即使相同,也是不同的方法)
然后我们在下一个cell中,分别对它们进行了标题,标签等的设置,我特意还把顺序打乱了,只要对象名正确,那么就跟顺序没有任何关系

说了这么多,足以见得面向figureaxes对象来画图的好处了。
什么?你只会用plt()画图?其实axes画图的指令和plt画图的指令是大同小异的,具体分析详见这篇文章
当然更希望你去看matplotlib的官方手册中关于axes的章节,里面有方法、参数的详尽介绍,那里才是最清楚明白的,哪个不会就去查哪个。
对了,上面的例子中我还用调用了pandas画图,然后把对象传给了ax3,有关这一话题,我们之后也会详细讨论。

觉得有用的话,不要吝惜评论点赞分享哦,希望大家多多包涵,有任何问题欢迎指正、讨论。
本文基于CC-BY-SA 4.0协议,欢迎转载


作者:小平友littlePING



plt pyplot matplotlib

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章