本文介绍如何用matplotlib绘制多个子图,并介绍控制它们布局的方法。按照其布局方式,分为均一排布,规整排布和跨行列排布三种。

一.均一排布plt.subplots()

均一排布的含义:所有子图的大小相同,规整的按行列排布在画布上。
强调:subplots()是plt类下属的方法。

1.subplots()控制布局

subplot函数及其重要参数:plt.subplots(row_number, column_number, figsize=(width, height), sharex=True, sharey=True)

row_number, column_number:一共生成多少行,多少列的子图(axes)。
figsize=(width, height):指定整个画布的大小。

这两个参数综合起来理解就是:创建一个大小为figsize的画布,并把画布按row_number, column_number划分成均一的子图框格,框格里可以添加子图(axes)。

sharex=True , sharey=True :是否共享横轴和纵轴刻度。
下图是一个共享x轴刻度,但是不共享y轴刻度是示例。前两行的x轴刻度因为相同,所以隐藏了。(x轴,y轴刻度的设置见第3个小标题)

返回值:plt.subplots()返回 类似的 [ [figure], [axes1, axes2…] ]类似的东西,需要用两个变量解包接受。读者可以自行打印返回结果验证一下。从返回值的类型我们需要知道:plt.subplots()不仅创建了figure,把布局规划好,且且为我们在每个子图框中创建了axes。关于解包,请参考这篇博客:https://editor.csdn.net/md/?articleId=111387910

2.suptitle() 添加画布的标题

fig.suptitle('引号里添加标题', size=number)

3.用axes类及其方法绘制子图

选定一个子图框
若axs为创建的axes变量名,使用axs[i][j]选中第i+1行j+1列的子图框。

绘图方法
axes类定义了和plt类似的绘图方法:.plot, .hist(), .scatter(), .bar(), barh.(), pie.()等,直接使用即可。

子图标题,坐标头与坐标轴范围

  1. 标题:axs[0][0].set_titile(‘引号里输入子图标题’)
  2. 坐标头:axs[0][0].set_xlabel(‘横坐标头’) , axs[0][0].set_ylable(‘纵坐标头’)
  3. 坐标轴范围:axs[0][0].set_xlim(min,max) , axs[0][0].set_ylim(min,max)

4.示例

import matplotlib.pyplot as plt
import numpy as np#把画布分为三行五列,并设置figure标题
fig,axs=plt.subplots(3,3,figsize=(15,15),sharex=True,sharey=False)
fig.suptitle('use .suptitle() to add a figure title')#选中第三行第三个画出散点图
axs[2][2].scatter(np.random.randn(10),np.random.randn(10))
axs[2][2].set_title('scatter')
axs[2][2].set_xlabel('x label')
axs[2][2].set_ylabel('y label')
axs[2][2].set_xlim(-5,8)#用for循环在第一二行的所有子图框中作图
for i in range(2):for j in range(3):axs[i][j].plot([2,4,8],range(3))plt.show()

运行结果为:

二.规整排布add_gridspec

所谓规整排布,是笔者自己的叫法,意思是所有子图按行列排布,没有出现跨行或跨列的情况,但是大小不一样。
强调:add_gridspec()是figure类下属的方法。所以我们需要先用plt.figure()创建一个figure。

1.add_gridspec()重要参数

spec = fig.add_gridspec(nrows=number, ncols=5, width_ratios=[1,2,3,4,5], height_ratios=[1,3])
nrows=2, ncols=5 : 与subplots()类似,把figure分成2行五列的子图框。
width_ratios=[1,2,3,4,5] :宽度比例。列表里的元素数应当与列数相同,代表各列的宽度比例。例如,ncols=5,那么list中应当有5个元素。
height_ratios=[1,3]):高度比例。列表里的元素数应当与行数相等,代表各行的高度比例。例如nrows=2,那么列表里应该有两个元素。
返回值:建议理解为无返回值。fig.add_gridspec()只是为figure划分了布局,并没有为我们创建axes,所以我们需要自己在子图框中创建axes。

2.绘制规整排布的子图

fig.add_gridspec()为我们把figure按行列划分成了子图框,所以我们可以用行列号选中子图框。假设我们用spec变量接受了fig.add_gridspec()的结果,那么我们可以用spec[i][i]来选中第i+1行j+1列的子图框。(注意与plt.subplots()比较,均一图选中的是axes,而规整图仅仅选中了子图框)。
为了绘制子图,我们需要使用fig.add_subplot()方法,并使用spec[i][i]作为参数选中第i+1行j+1列的子图框。
见代码:

import matplotlib.pyplot as plt
import numpy as npfig=plt.figure(figsize=(14,7))
spec=fig.add_gridspec(nrows=2,ncols=5,width_ratios=[1,5,3,2,3],height_ratios=[1,3])#在第二行第五列的子图框绘制子图
ax=fig.add_subplot(spec[1,4])
ax.scatter(np.random.rand(15),np.random.rand(15))#用for循环为前三列绘制子图
for i in range(2):for j in range(3):ax=fig.add_subplot(spec[i,j])ax.plot(range(5),[7,9,10,12,15])
plt.show()

运行结果如下:

三.跨行列子图布局

跨行列子图的figure划分方法一样,都是调用fig.add_gridspec()。想要实现跨行列的布局,在选中子图框时切片即可。例如:spec[:1,1:2]时选中第一二行的二三列。见示例:

import matplotlib.pyplot as plt
import numpy as npfig=plt.figure(figsize=(14,7))
spec=fig.add_gridspec(nrows=3,ncols=5,width_ratios=[1,5,3,2,3],height_ratios=[1,3,2])#绘制跨行列的子图,把一二行的二三列连成一块
ax=fig.add_subplot(spec[:2,1:3]) #选中了一二行和二三列
ax.scatter(np.random.rand(15),np.random.rand(15))plt.show()

选中了第一二行和二三列(共三行五列),运行结果如下:


参考:https://nbviewer.jupyter.org/github/datawhalechina/fantastic-matplotlib/blob/main/%E7%AC%AC%E4%B8%89%E5%9B%9E%EF%BC%9A%E5%B8%83%E5%B1%80%E6%A0%BC%E5%BC%8F%E5%AE%9A%E6%96%B9%E5%9C%86.ipynb#1.-%E5%A2%A8%E5%B0%94%E6%9C%AC1981%E5%B9%B4%E8%87%B31990%E5%B9%B4%E7%9A%84%E6%AF%8F%E6%9C%88%E6%B8%A9%E5%BA%A6%E6%83%85%E5%86%B5

Matplotlib——绘制多个子图(Axes)及其布局相关推荐

  1. matplotlib绘制四个子图

    import matplotlib.pyplot as plt import pandas as pd import numpy as np import seaborn as sns plt.rcP ...

  2. python Matplotlib 绘制多个子图

    from matplotlib import pyplot as plt import numpy as npa = np.arange(1, 30) # 划分子图 fig, axs = plt.su ...

  3. matplotlib绘制多个子图

    https://blog.csdn.net/Yonggie/article/details/96433341?utm_medium=distribute.pc_relevant_t0.none-tas ...

  4. 【python】python matplotlib绘制并保存多张图片+绘制多张子图

    需求描述:画图对比观测值和预测值,绘制对比图及多张子图 绘制对比图 示例代码 import matplotlib.pyplot as plt import numpy as npobs_x_data ...

  5. python画50个图-Matplotlib如何绘制多个子图

    作者:雪山飞猪 博客地址: https://www.cnblogs.com/chenqionghe/p/12355018.html 说明:本文经作者授权转载,禁止二次转载 Matplotlib是Pyt ...

  6. 【科研分享】Matplotlib 绘制多子图(subplot)进行实验结果分析

    Matplotlib 绘制多子图(subplot)进行实验结果分析   本文主要总结于本人近期的科研经历,在最后撰写论文试验分析的时候曾经被导师要求绘制一幅2*8的16子图的超参数分析结果图.所以踩了 ...

  7. Python Matplotlib绘制多子图准备训练数据和GIF动画实践

    我们程序员.设计人员,按需求辛辛苦苦开发出来的统计图形,往往达不到用户的要求,原因一般是表达不全面,也有内容过多而比较乱,真是众口难调. 其实,是我们表达方式与业务人员工作脱节.业务人员看了一张图或及 ...

  8. Matplotlib实现单画布绘制多个子图

    最近研究Python数据分析,需要利用Matplotlib绘制图表,并将多个图表绘制在一张图中,经过一番折腾,利用matplotlib包下的subplot()函数即可实现此功能. 代码实现: impo ...

  9. QGIS打印布局中绘制多个子图

    QGIS如何绘制多图 数据准备 这是一份英国大曼彻斯特地区的数据,里面包含了教育.收入.人口密度.绿地比例.城市比例等数据,我们准备把这些数据在地图上呈现出来,为此,我们需要做在地图中绘制6幅子图,这 ...

最新文章

  1. mysql事务并发控制_mysql事务和多版本并发控制详解
  2. iOS中的正则表达式[转]
  3. android sharedpreferences 工具类,android sharedpreferences工具类
  4. Django扩展xadmin后台管理
  5. 教你29招,让你在社交,职场上人人对你刮目相看
  6. 分布式MinIO快速入门 ​​​​​​​
  7. 利用搜索引擎实现关键词爬取内容
  8. c语言火车票管理系统360问答,C语言 车票管理系统 前面一点点的程序,不知道报错是什么意思,可以解释一下吗?代码的具体问题是什么...
  9. kite插件~快速提高代码速度
  10. Android使用本地广播
  11. java实验报告遇到的问题,JAVA实验报告_doc
  12. 详解:Drools规则引擎探究以及在IOT的应用
  13. Android 性能优化 (十一) 电量优化全解析 秒变大神
  14. 屌丝码农该怎么过周末
  15. ACM集训队论文合集
  16. UNI-APP_HbuilderX打包出错,本次打包选择了通讯录权限,请完成实名认证后再继续打包,取消通讯录权限打钩,还是提示使用通讯录权限需要实名制
  17. MC官方模板的分析Day1
  18. Python有趣|数据分析三板斧
  19. Typecho+Handsome主题美化
  20. matlab复数曲线拟合,lsqcurvefit拟合结果为复数

热门文章

  1. 刘邦韩信java_刘邦曾言三不杀韩信, 看懂后才知道是在玩他!
  2. STM32与威纶通触控屏通讯
  3. 用Python打造你的专属情人节贺卡,赶快发给TA浪漫一下吧
  4. 新手项目经理入坑指南
  5. 【致青春】致我终将逝去的22年的青春
  6. 8行python代码展示程序员从入门到大神(或跑路)的全部状态
  7. PyQt5第一部分-窗口类:QWidget, QDeskWidget, QTabWidget, QMainWindow, QDialog
  8. linux实验三:基于mykernel 2.0编写一个简单的操作系统内核
  9. 第三方注解框架,黄牛刀.使用步骤和方法
  10. ECCV2020 | 论文阅读——Arbitrary-Oriented Object Detection with Circular Smooth Label