浅谈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爬虫框架Scrapy实战之批量抓取招聘信息
Aug 07 Python
Django实现自定义404,500页面教程
Mar 26 Python
Python实现随机生成有效手机号码及身份证功能示例
Jun 05 Python
python实现俄罗斯方块游戏
Mar 25 Python
Numpy截取指定范围内的数据方法
Nov 14 Python
Python 中 -m 的典型用法、原理解析与发展演变
Nov 11 Python
查看端口并杀进程python脚本代码
Dec 17 Python
keras获得model中某一层的某一个Tensor的输出维度教程
Jan 24 Python
python属于跨平台语言码
Jun 09 Python
python转化excel数字日期为标准日期操作
Jul 14 Python
python更新数据库中某个字段的数据(方法详解)
Nov 18 Python
python自动化办公操作PPT的实现
Feb 05 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 文章调用类代码
2011/08/11 PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
2016/07/21 PHP
tp5.1 框架数据库-数据集操作实例分析
2020/05/26 PHP
JS创建优美的页面滑动块效果 - Glider.js
2007/09/27 Javascript
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
2009/12/28 Javascript
javascript ie6兼容position:fixed实现思路
2013/04/01 Javascript
jquery实现一个简单好用的弹出框
2014/09/26 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
JS获取屏幕高度的简单实现代码
2016/05/24 Javascript
如何利用JSHint减少JavaScript的错误
2016/08/23 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
js放大镜放大购物图片效果
2017/01/18 Javascript
ionic实现底部分享功能
2017/05/11 Javascript
关于webpack2和模块打包的新手指南(小结)
2017/08/07 Javascript
vue-resource + json-server模拟数据的方法
2017/11/02 Javascript
在mpvue框架中使用Vant WeappUI组件库的注意事项【推进】
2019/06/09 Javascript
纯JS实现五子棋游戏
2020/05/28 Javascript
[50:02]完美世界DOTA2联赛PWL S2 Magma vs FTD 第三场 11.29
2020/12/03 DOTA
python 生成不重复的随机数的代码
2011/05/15 Python
菜鸟使用python实现正则检测密码合法性
2016/01/05 Python
matlab中实现矩阵删除一行或一列的方法
2018/04/04 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
python将excel转换为csv的代码方法总结
2019/07/03 Python
django数据模型(Model)的字段类型解析
2019/12/25 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
2020/03/16 Python
python让函数不返回结果的方法
2020/06/22 Python
详解Python中的路径问题
2020/09/02 Python
.NET remoting中对象激活的两种方式
2015/06/08 面试题
自荐信结尾
2013/10/27 职场文书
关于赌博的检讨书
2014/01/08 职场文书
培训班主持词
2014/03/28 职场文书
优质护理服务演讲稿
2014/05/07 职场文书
自信主题班会
2015/08/14 职场文书
python编程实现清理微信重复缓存文件
2021/11/01 Python
Python语言内置数据类型
2022/02/24 Python