第5章 子图的绘制及坐标轴共享¶
· 绘制固定区域的子图
· 绘制自定义区域的子图
· 共享子图的坐标轴
· 子图的布局
Notes:¶
学习目标 掌握 绘制固定区域的子图 1
掌握 绘制自定义区域的子图 2
掌握
掌握
掌握 掌握 子图的布局 4
掌握 共享子图的坐标轴 3
Notes:¶
目录页 5.1 绘制固定区域的子图
5.2 绘制自定义区域的子图
5.3 共享子图的坐标轴
5.4 子图的布局
5.5 本章小结
目录页
5.1 绘制固定区域的子图
5.2 绘制自定义区域的子图
5.3 共享子图的坐标轴
5.4 子图的布局
5.5 本章小结
5.1.1 绘制单子图 用户为了能深入理解数据的含义,通常会将数据以一组相关图表的形式并排地显示到同一平面上,以便于从多个角度比较和分析数据。基于上述需求,matplotlib提供了一些将整个画布规划成若干区域,以及在指定区域上绘制子图(指每个区域上的图表)的功能。

5.1.1 绘制单子图 matplotlib可以将整个画布规划成等分布局的mn(行列)的矩阵区域,并按照先行后列的方式对每个区域进行编号(编号从1开始),之后在选中的某个或某些区域中绘制单个或多个子图。

画布被规划成3*2的矩阵区域及编号的示意图。
5.1.1 绘制单子图 使用pyplot模块的subplot()函数可以在规划好的某个区域中绘制单个子图。 语法
subplot(nrows, ncols, index, projection, polar, sharex, sharey, label, **kwargs) nrows:表示规划区域的行数。 ncols:表示规划区域的列数。 index:表示选择区域的索引,默认从1开始编号。 projection:表示子图的投影类型。 polar:表示是否使用极坐标,默认值为False。若参数polar设为True,则作用等同于projection='polar'。
5.1.1 绘制单子图 参数nrows、ncols、index既支持单独传参,也支持以一个3位整数(每位整数必须小于10)的形式传参。 subplot()函数会返回一个 Axes类的子类SubplotBase的对象。 Figure类对象可以使用add_subplot()方法绘制单子图,此方式与subplot()函数的作用是等价的。

多学一招:Jupyter Notebook的绘图模式 当Jupyter Notebook工具运行matplotlib程序时,默认会以静态图片的形式显示运行结果,此时的图片不支持放大或缩小等交互操作。Jupyter Notebook支持两种绘图模式,分别为控制台绘图和弹出窗绘图。

多学一招:Jupyter Notebook的绘图模式 控制台绘图 控制台绘图是默认模式,该模式是将绘制的图表以静态图片的形式显示,具有便于存储图片、不支持用户交互的特点。开发者可以在matplotlib程序中添加“%matplotlib inline”语句,通过控制台来显示图片。

多学一招:Jupyter Notebook的绘图模式 弹出窗绘图 弹出窗绘图模式是将绘制的图表以弹出窗口的形式显示,具有支持用户交互、支持多种图片存储格式的特点。开发者可以在matplotlib程序中添加“%matplotlib auto”或“%matplotlib notebook”语句,通过弹出窗口来显示图片。


多学一招:Jupyter Notebook的绘图模式

matplotlib程序添加完设置绘图模式的语句后,很有可能出现延迟设置绘图模式的现象。因此这里建议大家重启服务,即在Jupyter Notebook工具的菜单栏中选择【Kernel】->【Restart】,之后在弹出的“重启服务?”窗口中选择【重启】即可。
5.1.2 实例1:某工厂产品A与产品B去年的销售额分析 本实例要求根据下表的数据,先将画布规划成21的矩阵区域,并在索引为1的区域中绘制反映产品A和产品B销售额趋势的折线图;再将画布规划成22的矩阵区域,并在索引为3的区域中绘制反映产品A销售额占比的饼图;最后将画布规划成2*2的矩阵区域,并在索引为4的区域中绘制反映产品B销售额占比的饼图。


5.1.2 实例1:某工厂产品A与产品B去年的销售额分析

规划21的矩阵区域,选中索引为1的区域 由图可知,通过在同一画布中显示多个子图的方式可以从多个角度传递数据的信息。 规划22的矩阵区域,分别选中索引为3、4的区域
5.1.3 绘制多子图 使用pyplot模块的subplots()函数可以在规划好的所有区域中一次绘制多个子图。 语法
subplots(nrows=1,ncols=1,sharex=False,sharey=False,squeeze=True,subplot_kw=None,gridspec_kw=None,**fig_kw) nrows:表示规划区域的行数,默认为1。 ncols:表示规划区域的列数,默认为1。 sharex, sharey:表示是否共享子图的x轴或y轴。 subplots()函数会返回包含两个元素的元组,其中该元组的第一个元素为Figure对象,第二个元素为Axes对象或Axes对象数组。
5.1.4 实例2:部分国家养猫与养狗人群比例分析 随着人们生活水平的提高,许多人都会在家里养一些萌宠,有时还会在抖音上分享萌宠日常的可爱视频。


5.1.4 实例2:部分国家养猫与养狗人群比例分析 本实例要求根据下表的数据,将整个画布规划成1*2的矩阵区域,并在索引为1和索引为2的区域中分别绘制反映养猫人群比例与养狗人群比例的条形图 。


5.1.4 实例2:部分国家养猫与养狗人群比例分析

由图可知,俄罗斯养猫人群的比例最高,墨西哥养狗人群的比例最高。 规划1*2的矩阵区域,依次在每个区域中绘制子图
目录页 5.1 绘制固定区域的子图

5.2 绘制自定义区域的子图 5.3 共享子图的坐标轴 5.4 子图的布局 5.5 本章小结
5.2.1 绘制单子图 使用pyplot模块的subplot2grid()函数可以将整个画布规划成非等分布局的区域,并可在选中的某个区域中绘制单个子图。 语法
subplot2grid(shape, loc, rowspan=1, colspan=1, fig=None, **kwargs) shape:表示规划的区域结构,该参数接收一个包含两个整型数据的元组,元组中第1个元素表示规划区域的行数,第2个元素代表规划区域的列数。 loc:表示选择区域的位置,该参数接收一个包含两个整型数据的元组,元组中第1个元素表示子图所在的行数(行数从0开始),第2个元素表示子图所在的列数(列数从0开始)。 rowspan:表示向下跨越的行数,默认为1。 colspan:表示向右跨越的列数,默认为1。
5.2.2 实例3:2017年与2018年抖音用户分析 抖音是一款音乐创意短视频社交软件,该软件自2016年9月上线以来受到越来越多年轻人的欢迎。用户可以通过这款软件选择歌曲,拍摄音乐短视频,生成自己的作品。

5.2.2 实例3:2017年与2018年抖音用户分析 本实例要求根据下表的数据,使用3个子图进行展示:在第0~1行第0~1列的区域中,绘制说明2018年相比于2017年人群增长倍数的柱形图;在第2行第0列、第2行第1列的区域中,分别绘制说明2017年、2018年抖音用户地区分布比例的饼图。


5.2.2 实例3:2017年与2018年抖音用户分析
第0~1行第0~1列的区域
第2行第0列
的区域
第2行第1列
的区域
目录页 5.1 绘制固定区域的子图
5.2 绘制自定义区域的子图
5.3 共享子图的坐标轴 5.4 子图的布局 5.5 本章小结
5.3.1 共享相邻子图的坐标轴 当使用subplots()函数绘制子图时,可以通过该函数的sharex或sharey参数控制是否共享x轴或y轴。sharex或sharey参数支持False或'none'、True或'all'、'row'、'col'中任一取值。 True或'all':表示所有子图之间共享x轴或y轴。 False或'none':表示所有子图之间不共享x轴或y轴。 'row':表示每一行的子图之间共享x轴或y轴。 'col':表示每一列的子图之间共享x轴或y轴。
5.3.1 共享相邻子图的坐标轴


'all'—所有子图共享x轴 'none'—所有子图不共享x轴

row:每行子图共享x轴
col:每列子图共享x轴
5.3.2 共享非相邻子图的坐标轴 当使用pyplot的subplot()函数绘制子图时,也可以将代表其它子图的变量赋值给该函数的sharex或sharey参数,此时可以共享非相邻子图之间的坐标轴。

多学一招:共享同一子图的坐标轴
单个子图也可以共享坐标轴,它通常会将y轴作为一组图形参考的坐标轴,将右侧的垂直坐标轴作为另一组图形参考的坐标轴。
多学一招:共享同一子图的坐标轴 twinx()函数用于共享同一子图的坐标轴。 twinx()函数会返回共享x轴的新绘图区域(Axes类的对象),新创建的绘图区域具有不可见的x轴和独立的、位于右侧的y轴。 语法
twinx(ax=None) 以上函数的ax函数表示要共享坐标轴的子图。
5.3.3 实例4:某地区全年气温和水量的关系 气候是地球上某一地区大气的多年平均状况,主要有光照、气温、降水等气候要素,其中气温、降水是反映一个地区气候特征的重要指标。


5.3.3 实例4:某地区全年气温和水量的关系 本实例要求根据下表的数据,将月份列的数据作为x轴的刻度标签,将平均气温、降水量、蒸发量三列的数据作为y轴的数据,在同一绘图区域中分别绘制反映平均气温、降水量、蒸发量关系的图表 。


5.3.3 实例4:某地区全年气温和水量的关系

折线图参照的坐标轴 由图可知,随着气温的升高,蒸发量也有所增加,降水量与蒸发量大致相等。 堆积柱形图 参照的坐标轴
目录页 5.1 绘制固定区域的子图
5.2 绘制自定义区域的子图
5.3 共享子图的坐标轴
5.4 子图的布局 5.5 本章小结
5.4.1 约束布局 当带有标题的多个子图并排显示时,多个子图会因区域过于紧凑而出现标题和坐标轴之间相互重叠的问题,而且子图元素的摆放过于紧凑,影响用户的正常查看。matplotlib中提供了一些调整子图布局的方法,包括约束布局、紧密布局和自定义布局,通过这些方法可以合理布局多个子图。

5.4.1 约束布局
什么是约束布局?

5.4.1 约束布局
约束布局是指通过一系列限制来确定画布中元素的位置的方式,它预先会确定一个元素的绝对定位,之后以该元素的为基点将其它元素进行绝对定位,从而灵活地定位和调整元素的位置。
5.4.1 约束布局
matplotlib在绘制多子图时默认并未启用约束布局,它提供了两种方式启用约束布局:第一种方式是使用subplots()或figure()函数的constrained_layout参数,第二种方式是修改figure.constrained_layout.use配置项。
5.4.1 约束布局 第2种 第1种 在使用subplots()或figure()函数创建子图或画布时,可以将这些函数的constrained_ layout参数的值设置为True,以启用约束布局来调整图表元素的位置。 matplotlib可以通过rcParams字典或rc()函数修改figure.constrained_layout.use配置项的值为True,以启用约束布局来调整图表元素的位置。 示例
plt.subplots(constrained_layout=True) 示例
plt.rcParams['figure. constrained_layout.use'] = True
5.4.1 约束布局 除此之外,通过以下配置项或者是Figure类对象的方法可以使用约束布局或者手动调整子图的内边距。 figure.constrained_layout.w_pad/ h_pad:表示绘图区域的内边距。 figure.constrained_layout.wspace/ hspace:表示子图之间的间隙,默认为 0.02。 set_constrained_layout():设置是否使用约束布局。若该方法传入参数None,则说明使用配置文件中rcParams['figure.constrained_layout.use']指定的值。 set_constrained_layout_pads():设置子图的内边距。
5.4.1 约束布局

约束布局仅适用于调整刻度标签、轴标签、标题和图例的位置,而不会调整子图其他元素的位置。因此,使用约束布局后的子图之间仍然会出现图表元素被裁剪或重叠的问题。
5.4.2 紧密布局
什么是紧密布局?

5.4.2 紧密布局
紧密布局采用紧凑的形式将子图排列到画布中,仅适用于刻度标签、坐标轴标签和标题位置的调整。
pyplot中提供了两种实现紧密布局的方式。
第一种:使用tight_layout()函数。
第二种:修改figure.autolayoutrcParam 配置项。
5.4.2 紧密布局 使用tight_layout()函数 matplotlib在1.1版本中引入了tight_layout()函数,通过该函数可以调整子图的内边距及子图的间隙,使子图能适应画布的绘图区域。 语法
tight_layout(pad=1.08, h_pad=None, w_pad=None, rect=None) pad:表示画布边缘与子图边缘之间的空白区域的大小,默认为1.08。 h_pad,w_pad:表示相邻子图之间的空白区域的大小。 rect:表示调整所有子图位置的矩形区域的四元组(left, bottom, right, top),默认为 (0,0,1,1)。 当pad参数设为0时,空白区域的文本会出现被裁剪的现象,之所以产生文本部分缺失的情况,可能是因为算法错误或受到算法的限制。因此,官方建议pad参数的取值应至少大于0.3。
5.4.2 紧密布局 修改figure.autolayoutrcParam 配置项 pyplot可以通过rcParams字典或rc()函数修改figure.autolayoutrcParam配置项的值为True,使子图元素能适应画布的绘图区域。 示例
plt.rcParams['figure.autolayoutrcParam'] = True
5.4.3 自定义布局 matplotlib的gridspec模块是专门指定画布中子图位置的模块,该模块中包含一个GridSpec类,通过显式地创建GridSpec类对象来自定义画布中子图的布局结构,使得子图能够更好地适应画布。 语法
GridSpec(nrows, ncols, figure=None, left=None, bottom=None, right=None, top=None, wspace=None, hspace=None, width_ratios=None, height_ratios=None) left,bottom,right,top:表示子图的范围。 wspace:表示子图之间预留的宽度量。 hspace:表示子图之间预留的高度量。 nrows:表示行数。 ncols:表示列数。 figure:表示布局的画布。
5.4.3 自定义布局
GridSpec类对象的使用方式与数组的使用方式相似,它采用索引或切片的形式访问每个布局元素。
matplotlib中还为Figure对象提供了快速添加布局结构的方法add_gridspec() 。
5.4.3 自定义布局 使用subplot2grid()函数创建的子图默认已经拥有了自定义的布局结构。
import matplotlib.gridspec as gridspec gs = gridspec.GridSpec(2, 2) ax = plt.subplot(gs[0,0])
ax = plt.subplot2grid((2, 2), (0, 0)) 示例 示例
5.4.4 实例5:2018上半年某品牌汽车销售情况 随着人们的生活水平日益提高,汽车已经成为人们出行的代步工具,为人们的生活带来了便利。已知某品牌汽车在北京、上海、广州、深圳、浙江、山东设立了6个分公司,各分公司在2018年的销售额十分可观。


5.4.4 实例5:2018上半年某品牌汽车销售情况 本实例要求根据下表的数据,分别使用3个子图进行展示:在第0行第0列的区域中,绘制反映2018上半年汽车销售额的柱形图;在第1行第0列和第1行第1列的区域中,绘制反映2018上半年各分公司汽车销量的折线图和堆积面积图。



5.4.4 实例5:2018上半年某品牌汽车销售情况
在第0行第0列的区域中,绘制柱形图
在第1行第0列的区域中,绘制堆积面积图
在第1行第1列的区域中,绘制堆积面积图
目录页 5.1 绘制固定区域的子图
5.2 绘制自定义区域的子图
5.3 共享子图的坐标轴
5.4 子图的布局
5.5 本章小结
5.5 本章小结
本章主要围绕着子图的相关内容进行了介绍,首先介绍了子图的绘制,包括绘制固定区域和绘制自定义区域的子图,然后介绍了子图坐标轴的共享,最后介绍了子图的布局。通过学习本章的内容,希望读者能理解子图的意义,可以熟练地规划子图的布局。