对象!对象!对象!重要的事情说三遍!
即便你没有对象,在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都无法复现的问题(同样一段代码,在我这里没问题,在你那里就不行)
所以,我极力推荐先实例化figure
和axes
对象,然后对axes
对象调用方法来实现画图和设置。
在matplotlib中,有两个重要的对象类型:figure
对象可以把它想成一张空白图纸,在上面可以绘制一个或多个axes
对象(还可以有其他对象等)。axes
对象是一个图像的主要部分(它包括了图线、xy轴等部分)。
我们可以使用plt
接口生成figure
对象和axes
对象,然后对axes
对象调用方法来实现画图和设置。
总体思路是:
figure
对象
实例化axes
对象
对axes
对象调用方法进行画图和设置
相同的例子:
我们实例化figure1
对象,并且我们在figure1
下生成它的ax1
对象。
从上面的截图我们可以看到,即便是在不同的cell里面,调用figure1
的savefig()
方法也是可行的,生成了我指定的fig1.jpg
文件
这就是面向figure
和axes
对象来画图的好处之一。
现在我们就能来解决之前提出的同时画A、B两张图的问题了。
我们先实例化了三个figure对象(figure1
,figure2
,figure3
),在每个figure对象下都分别有一个axes对象(xa1
,ax2
,ax3
)。
在画xa1
,ax2
的时候,我们的对象是axes,方法是plot()
和bar()
来绘制折线图和柱状图。
在画ax3
的时候,我们的对象是data(它是Series
类型),方法是plot()
来绘制柱状图。
(注意因为对象类型不同,他们的方法名即使相同,也是不同的方法)
然后我们在下一个cell中,分别对它们进行了标题,标签等的设置,我特意还把顺序打乱了,只要对象名正确,那么就跟顺序没有任何关系
说了这么多,足以见得面向figure
和axes
对象来画图的好处了。
什么?你只会用plt()
画图?其实axes
画图的指令和plt
画图的指令是大同小异的,具体分析详见这篇文章
当然更希望你去看matplotlib的官方手册中关于axes的章节,里面有方法、参数的详尽介绍,那里才是最清楚明白的,哪个不会就去查哪个。
对了,上面的例子中我还用调用了pandas画图,然后把对象传给了ax3
,有关这一话题,我们之后也会详细讨论。
觉得有用的话,不要吝惜评论点赞分享哦,希望大家多多包涵,有任何问题欢迎指正、讨论。
本文基于CC-BY-SA 4.0协议,欢迎转载