浅谈matplotlib.pyplot与axes的关系


Posted in Python onMarch 06, 2020

最近在学习数据可视化,梳理一下其中一些诸如pandas绘图、matplotlib绘图、pyplot(plt)、axes等概念。

重要的事情说三遍:axes不是axis!axes不是axis!axes不是axis!
重要的事情说三遍:pyplot是接口不是对象!pyplot是接口不是对象!pyplot是接口不是对象!

很多书上一上来就直接import matplotlib.pypltot as plt,然后就教你plt.xxx()。这种方式固然没错,可问题就出在了plt只是一个interface,只是一个接口,连对象都算不上(仔细回想,你确实没有实例化过任何一个名叫plt类型的对象)这给本来就对面向对象编程并不很熟悉的我带来无穷无尽的困扰plt这个接口的意义在于:

  • 通过接口直接画图(这时候我们把这个接口看成一个黑盒,根本不要去管其中有些什么对象类型)
  • 通过接口实例化别的类型的对象(如figure类型 axes类型等)

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()

浅谈matplotlib.pyplot与axes的关系

上面这个例子就展示了pyplot(plt)的特点,不用指明对象就能进行画图和设置,当我们在同一个程序中的图比较少的时候这是方便的,但当我们同一个程序中的图很多的时候,这种没有显性对象的方式会导致我们没有办法重新调用之前的图(因为没有对象名)也会给人一种很不踏实的感觉

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='->'))

浅谈matplotlib.pyplot与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 相关文章推荐
Python中的urllib模块使用详解
Jul 07 Python
Python字符串匹配算法KMP实例
Jul 18 Python
python中MethodType方法介绍与使用示例
Aug 03 Python
使用Python读取大文件的方法
Feb 11 Python
对pandas进行数据预处理的实例讲解
Apr 20 Python
使用pandas读取csv文件的指定列方法
Apr 21 Python
Python采集代理ip并判断是否可用和定时更新的方法
May 07 Python
用Python PIL实现几个简单的图片特效
Jan 18 Python
python全栈知识点总结
Jul 01 Python
Tensorflow实现部分参数梯度更新操作
Jan 23 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
Feb 12 Python
PyQt5实现多张图片显示并滚动
Jun 11 Python
python-xpath获取html文档的部分内容
Mar 06 #Python
关于python中的xpath解析定位
Mar 06 #Python
Python网络爬虫信息提取mooc代码实例
Mar 06 #Python
appium+python adb常用命令分享
Mar 06 #Python
Python+appium框架原生代码实现App自动化测试详解
Mar 06 #Python
python使用paramiko实现ssh的功能详解
Mar 06 #Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
Mar 06 #Python
You might like
php读取30天之内的根据算法排序的代码
2008/04/06 PHP
php实现的仿阿里巴巴实现同类产品翻页
2009/12/11 PHP
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
php set_time_limit()函数的使用详解
2013/06/05 PHP
web server使用php生成web页面的三种方法总结
2013/10/28 PHP
PHP分页详细讲解(有实例)
2013/10/30 PHP
php实现ip白名单黑名单功能
2015/03/12 PHP
PHP Ajax实现无刷新附件上传
2016/08/17 PHP
AJAX PHP无刷新form表单提交的简单实现(推荐)
2016/09/09 PHP
PHP实现上传图片到 zimg 服务器
2016/10/19 PHP
Yii 2.0如何使用页面缓存方法示例
2017/05/23 PHP
ko knockoutjs动态属性绑定技巧应用
2012/11/14 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
2015/09/04 Javascript
浅谈Vue的基本应用
2016/12/27 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
2017/07/19 Javascript
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
使用use注册Vue全局组件和全局指令的方法
2018/03/08 Javascript
ES6知识点整理之函数数组参数的默认值及其解构应用示例
2019/04/17 Javascript
通过layer实现可输入的模态框的例子
2019/09/27 Javascript
vue实现动态表格提交参数动态生成控件的操作
2020/11/09 Javascript
python简单判断序列是否为空的方法
2015/06/30 Python
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
Python中对象迭代与反迭代的技巧总结
2016/09/17 Python
利用Pandas读取文件路径或文件名称包含中文的csv文件方法
2018/07/04 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
法国一家多品牌成衣精品中/高档商店:Graduate Store
2019/08/28 全球购物
如何提高MySql的安全性
2014/06/19 面试题
安全生产专项整治方案
2014/05/06 职场文书
2014法院干警廉洁警示教育思想汇报
2014/09/13 职场文书
2014各大专业毕业生自我评价
2014/09/17 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
研究生毕业论文导师评语
2014/12/31 职场文书
治庸问责工作总结
2015/08/11 职场文书
用python删除文件夹中的重复图片(图片去重)
2021/05/12 Python
《最终幻想14》6.01版本4月5日推出 追加新任务新道具
2022/04/03 其他游戏