matplotlib之疑难点figure、axes-程序员宅基地

技术标签: python  可视化  机器学习  matplotlib  数据可视化  Python  

matplot是python经常使用的一个数据可视化库,里面包含了很多方便的函数方法。

1. plt.figure()

首先展示一个最简单的画线函数plot(),绘制一条直线。

import matplotlib.pyplot as plt
import numpy as np

data = np.linspace(1, 100, 101)
plt.figure()
plt.subplot(111)   #如果figure中只有一个坐标系,该句可以省略,plt.plot()等绘图函数会隐式自动创建一个axes
plt.plot(data)
plt.show()

对比一下代码:

data = np.linspace(1, 100, 101)

plt.plot(data)
plt.show()

只是去掉了一句话plt.figure(),仍然可以实现上述的绘图,所以这里的plt.figure作用是什么,是否必须?

答:plt.figure在日常使用的时候非必须,在matplotlib中,调用plt.figure()会显式的创建一个图形,表示一个图形用户界面窗口。但是通过调用plt.plot()或类似的方法也会隐式的创建图形figure。这对于简单的图表没有问题,但是对于更高级的应用,能显式的创建图形并得到实例的引用时非常有用的。当你的程序中需要绘制两幅图的时候,你可以选择将两个图都绘制在一个图形figure中,也可以选择分别绘制在两个图形figure中,一般来说直接调用plt.plot()等绘图函数时,都是默认在当前的工作区内操作的,如何切换不同的图形figure,这里就体现出plt.figure()的作用了,该方法的全部参数如下,详细参数说明见该链接

matplotlib.pyplot.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True, FigureClass=<class 'matplotlib.figure.Figure'>, clear=False, **kwargs)

  接下来展示一段代码来说明,plt.figure()中关键字num的作用,当存在多个figure的时候,就可以通过调用plt.figure(),传入对应的参数即可激活对应的figure,其中figure是有对应的编号的,可以传入数字来激活。

x = np.linspace(-np.pi, np.pi, 256)
y1 = np.sin(x)
y2 = np.cos(x)

fig1 = plt.figure(num='first')
fig1.suptitle('first figure')
plt.plot(x, y1)

fig2 = plt.figure(num='second')
fig2.suptitle('second figure')
plt.plot(x, y2)

plt.figure(num=1)  #plt.figure(num='first')
plt.plot(x, y2)
plt.show()

2. plt.subplot()

上面已经明了了figure的作用,所以还是建议大家写程序的时候把plt.figure()先写上,再继续。接下来是另外一个很常见的函数plt.subplot(),该方法可以创建多个坐标系axes,先来一个小例子,如下在一个图形figure中绘制两个坐标系axes。

x = np.linspace(-np.pi, np.pi, 256)
y1 = np.sin(x)
y2 = np.cos(x)

fig = plt.figure(num='first')
fig.suptitle('figure')

plt.subplot(221)
plt.plot(x, y1)
plt.subplot(224)
plt.plot(x, y2)

plt.show()

一般来说,plt.subplot()方法会传入一个三位的整数,其中前两位表示创建的figure中是如何划分坐标系的,比如221,其中22就是2*2的网格,第三个数字表示选中第几个网格,其中1表示第一个网格,4表示第四个网格。在调用该函数的时候就会激活该坐标系,之后所有的plt.****()方法都会在该坐标系axis中进行,subplot方法还会返回一个句柄,该句柄与该坐标系绑定,也可以直接调用该句柄加对应的方法直接操作对应的坐标系。所以最好每次调用subplot的时候将句柄保存下来,方便之后调用,同时也尽量使用句柄调用方法,这样代码更加清晰明了,让你知道你当前在操作的是哪一个坐标系,而plt.****()则不能显式的看出来。

fig = plt.figure()
fig.suptitle('Figure')

axis1 = plt.subplot(221)
axis1.plot([1,2,3,4])

axis4 = plt.subplot(224)
axis4.plot([1,2,3,4])

axis1.set_title('axes[0]')
axis4.set_title('axes[1]')
plt.show()

PS: 到这里就产生两个概念了,分别是图形figure和坐标系axes,这两个概念刚开始不好弄清楚,这里用通俗一点的话来说:"图形figure像是一种画布,而坐标系axes就是画布上面分布的方框区域,称之为坐标系axes“。

plt.subplot()方法的全部参数如下,具体见链接

matplotlib.pyplot.subplot(nrows, ncols, index, **kwargs)
matplotlib.pyplot.subplot(pos, **kwargs)

3. plt.subplots()

与plt.subplot()类似的还有一个方法plt.subplots(),仅有一个字符之差,该通过一个小例子来看一下两者的区别:

fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(7,7))
fig.suptitle('Figure')

axes[0][0].plot([1,2,3,4])
axes[0][1].plot([1,2,3,4])

axes[1][1].plot([1,2,3,4])
axes[1][1].set_title('axes[1][1]')
plt.show()

可以看得出,该方法的返回值有两个,分别是figure和axes,并且可以通过axes直接调用对应的坐标系,这里axes是一个列表,尺寸为2*2,即使我们只画了三个坐标系,但是实际还是存在4个,并且也都画出来了,对比一个上一幅图中subplot()方法画了两个坐标系,实际就存在两个坐标系,最后显示的也是两个。

具体的方法调用参见官网链接

matplotlib.pyplot.subplots(nrows=1, ncols=1, *, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)

4. fig.add_subplot()  VS  fig.add_axes()

pyplot的方式中plt.subplot()和面向对象中的对象figure.add_subplot()的参数和含义都相同,不同的是subplot是pyplot的一个方法,而add_subplot的调用对象是一个figure对象

fig = plt.figure()                  #先创建一个figure对象
axis1 = fig.add_subplot(121)        #figure对象调用方法add_subplot
axis1.plot([1,2,3,4])
axis2 = fig.add_subplot(122)
axis2.plot([4,3,2,1])
plt.show()

add_axes()方法跟add_subplot()都是基于对象的方法实现,功能也是往一个图figure中添加一个坐标轴区域,但不同的是subplot的绘制都是标准化的网格方式,比如subplot(222)代表创建的只能是2*2的网格,网格的位置比例都是相对固定死的,不能随意调整,而add_axes()方法就是为了更加方便定制坐标轴的位置,可以将坐标轴axes放在figure中的任何一块区域

fig = plt.figure()
ax1 = fig.add_axes([0.1, 0.1, 0.8, 0.8])  #left, bottom, width, height
ax1.plot([1,2,3,4])
ax1.set_title('ax1')

ax2 = fig.add_axes([0.5, 0.5, 0.25, 0.25])  #新增区域ax2,嵌套在ax1内
ax2.plot([1,2,3,4])
ax2.set_title('ax2')
plt.show()

5. 总结

这篇文章主要是为了解决matplotlib.pyplot中常出现的figure和axes两个概念进行一下辨析,

  1. figure是一个图形界面,一个画布,而axes是一个坐标轴界面,一个figure上可以放置多个axes坐标轴;
  2. plt.subplot()和figure.add_subplot()两种方法的功能和参数完全一样,但是两者的设计里面不一样,后者add_subplot()是基于对象设计的一种方法,其调用对象是一个figure对象,而subplot是一个类调用;
  3. plt.plot()等绘线函数会自动创建一个axes坐标轴,默认情况下,plt.***()的调用都是基于当前坐标轴对象的,所以相应的方法也可以都换成axes.***()基于对象的方法实现;

参考文章

https://zhuanlan.zhihu.com/p/256505470

 

 

 

 

 

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/stefanjoe/article/details/112004192

智能推荐

i5 10200h和i7 10750h 哪个好_10200和10750-程序员宅基地

i5-10200H的酷睿处理器,它采用4核心8线程,和我们熟悉的i5-10300H相比,默认主频从2.5GHz降为了2.4GHz,最高(单核)睿频加速频率从4.5GHz降为了4.1GHz,综合性能下降了大约10%不到,但却换来了更低的采购价格。选i5 10200h还是i7 10750h 这些点很重要!看完你就知道了https://list.jd.com/list.html?英特尔酷睿i7-10750H是一款高端笔记本电脑处理器,具有基于Comet Lake架构(CML-H,第4代Skylake)主频_10200和10750

Ubuntu下Linux安装与配置_ubuntu怎么配置linux_怀中猫·cherish的博客-程序员宅基地

Ubuntu中Linux安装及配置这篇我主要说一下如何配置,自己也是刚开始用,参照各种方法总结出来的比较简单适合新手,发出来仅供大家参考,有问题欢迎指出。下面说一下具体步骤:1.安装步骤推荐在微信公众号软件安装管家,输入Linux会出现安装包和安装过程,根据步骤安装Ubuntu安装途中,配置网络时建议网络适配器设置为NAT模式,后面下载更新要使用网络安装好后,进入界面。第一次打开界面..._ubuntu怎么配置linux

kuangbin数学训练1-程序员宅基地

LightOJ - 1078 Integer Divisibility 思路博弈先手必胜: 可以走到必败状态先手必败: 无论如何也走不到必败状态该题,模拟一下就知道若Alice先手的情况,则n%3 == 1 是先手必败状态若Bob先手的情况,则n%3 == 0 是先手必败状态代码#include<iostream>#include<cstring>#include<algorithm>using namespace std;int ma_kuangbin数学

用Python对微信好友进行简单统计分析-程序员宅基地

目录第一步:首先抓取微信朋友的资料第二步:性别统计和地区分布第三步:生成省份好友分布地图第四步:最后运用opencv的图像识别进行人像识别,统计微信好友中用人像作为头像的好友人数。微信一共有多少位好友?这里面你认识多少人?你知道你微信朋友的男女比例嘛?你知道你微信朋友大部分来自什么地方吗?以下的代码内容只涉及一些简单的Python知识,稍微有一点Python知识的朋友都可以读下去。第一步:首先抓取微信朋友的资料既然是要做统计和分析,第一步就是微信朋友的所有可以抓取的资料抓取出

elasticsearch建立geo search-程序员宅基地

buildmvn clean package -DskipTestsruncd ./target/binexport ES_CLASSPATH="../classes:../lib/*"; ./elasticsearchcreate indexcurl -XPUT http://l..._elasticsearch geo创建

如何在react项目中配置less-程序员宅基地

如何在create-react-app创建的项目下配置less,其实很简单,只是create-react-app创建的项目没有暴露webpack相关配置,所以需要暴露出webpack相关配置,具体操作如下:一、暴露webpack,安装less\less-loader依赖在create-react-app创建的项目下是不支持less的,我们要使用less就需要在相关配置文件中配置。...

随便推点

算法导论:c++选择算法-程序员宅基地

选择算法即给定数组A,选出第i个大的元素,区别于排序后选择这种比较慢的方法,选择算法不需要排序即可选出第i个大元素基于随机快排选择算法首先实现随机快排: 随机快排就是在快排的基础上主元用随机数产生。// 随机快速排序之随机选择替代主元int random_partition(int array[], int p, int r){ int i=(rand() % (r - p + 1))

binSearch的三种形式-程序员宅基地

1.binSearch比较次数不平衡,一方比较次数比一方比较次数多1,所以可以有所改进,根据改进方向的不同,可以改进为fibonaccian查找(寻找比例的最优值)或者binSearch2(想办法平衡比较次数) 2.binSearch2次数平衡,但却不满足约定,为了满足约定,所以有了binSearch3 3.binSearch3看似有所遗漏,实则精巧,其正确性可以用不变性和单调性证明#...

crm系统收费多少?_crm软件es收费标志-程序员宅基地

crm 系统收费多少?。在网络时代,客户口碑传播的实际效果远胜于宣传广告,而老顾客认购还可以说成一种较为理想化的顾客情况。殊不知,销售市场同行业愈来愈热烈,怎样才可以吸引老顾客?依靠crm 系统管理方法,会让我们产生出乎意料地获得。_crm软件es收费标志

<input type="file">accept属性 调起手机摄像头 支持Safari Chrome和大部分手机内置浏览器_input camera chrome-程序员宅基地

之前在网上找了很多资料用html调取手机的摄像头,一般在Safari浏览器上都不好用,其实后来发现,标签的accept属性就可以很好的解决这个问题。1.调起相册 2.调起摄像头_input camera chrome

Android校园购物app案例(javaweb服务端)_android购物app实例-程序员宅基地

功能描述:本系统是带服务端的app。管理员通过后台进行商品管理、类别管理、商铺管理、订单管理、用户管理。前台主要功能包括了用户注册、快速浏览、用户登录,商品查询,添加购物车,提交订单,购物车管理等功能。手机端使用android原生和jquerymobile框架混合开发,界面整洁简单,适合新手学习。开发语言:java技术框架:ssh,easyui,mvc,JqueryMobile开发工具:android端使用eclipse+adt,服务器端MyEclipse2013或以上数据库_android购物app实例

android开发轻量级数据库SQLite_android 轻量级数据库-程序员宅基地

android开发app难免要存储一些数据到本地,作为缓存,这就要用到安卓系统的SQLite 数据库用于存储数据,数据以文档的形式存到本地外部存储空间。 SQLite与mySQL存储方式差别不大,都是以表格的形式存储。 存下来的表格可以在手机外存中查看。_android 轻量级数据库

推荐文章

热门文章

相关标签