subplot

义项:MATLAB绘图子图函数
subplot

subplot是MATLAB中用于在同一图窗内划分网格、在指定分块位置创建坐标区的绘图函数,常写为subplot(m,n,p)。它把当前图窗切成m行n列的子图区域,并按行顺序编号选中第p个区域作为绘图目标,是科学计算与工程绘图中在一张图里并排展示多组数据的常用手段。自R2019b起,MathWorks推荐使用tiledlayout和nexttile组合替代subplot以更灵活地控制间距与共享标注[1]。

目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

subplot是MATLAB图形系统提供的坐标区创建函数(Axes creation function),作用是在一个图窗(figure)中按网格划分出多个绘图区域,每个区域对应一个坐标区对象。最基本的调用形式为subplot(m,n,p):把当前图窗划分为m行n列的矩形分块,并在第p个分块上生成坐标区,随后的绘图命令绘制在这个坐标区中。函数还可以返回坐标区对象句柄,形式为ax = subplot(…),句柄类型可能是Axes、PolarAxes或GeographicAxes对象,便于之后修改坐标区属性。

除按网格定位外,subplot还接受'replace'、'align'等选项参量和名称-值对组参量,用于删除并重建指定位置的坐标区、对齐各子图的绘图框,或自定义坐标区属性。早期版本的文档给出的调用形式包括subplot(m,n,p)、subplot(h)和subplot('Position',[left bottom width height]),以及带返回值的h = subplot(…)[2]。

原理

subplot并不真正把图窗“切”成物理小块,它的做法是为每个分块计算一个归一化位置矩形,然后在这些矩形位置上创建彼此独立的坐标区对象[2]。子图的位置参数p按行优先顺序解释:第1个子图位于第1行第1列,第2个子图位于第1行第2列,依此类推。当p取向量时,选中的坐标区将覆盖向量中列出的全部网格位置,因此可以做出横跨整行或整列的长条形子图。

每个坐标区的位置可用四元素向量表示:$pos = [left\; bottom\; width\; height]$,其中left、bottom、width、height均以图窗为参照做归一化,取值范围为0.0至1.0,坐标原点位于图窗左下角[3]。使用subplot('Position',pos)形式可以直接给出这一向量,从而把子图放在不与网格对齐的自定义位置上。两种定位方式的对应关系可概括如下:

按网格调用时,MATLAB会根据行数、列数把图窗可用区域等分成若干单元,各单元再按默认边距收缩为绘图框,这也是subplot生成的子图之间总留有空白的原因。若希望压缩这些空白,可以读取坐标区的Position属性并手动改写其中的left、bottom、width、height四个分量,或借助社区提供的紧缩子图函数。

发展历程

MATLAB最初由Cleve Moler在20世纪70年代后期以Fortran编写,起初只是调用LINPACK与EISPACK子程序的交互式矩阵计算工具;1984年MATLAB成为商业产品,内核改用C语言重写,并在数值计算之外增加了用户函数、工具箱和图形功能[4]。subplot属于这批早期图形功能中用于多坐标区排布的函数,其语法在MATLAB 6时代的函数参考手册中已基本定型[2]。

为了向后兼容,subplot(111)被保留为一个特殊写法:它与subplot(1,1,1)行为并不相同,不会立即创建坐标区,而是把图窗的NextPlot属性设为replace,使下一条绘图命令先执行一次clf reset删除图窗原有内容,再在默认位置生成新坐标区;该写法不返回句柄,因此指定返回值会报错[2]。

随着布局需求增长,MathWorks在R2019b中引入tiledlayout与nexttile函数,并在subplot的文档页面顶部提示:与subplot相比更推荐使用tiledlayout,因为后者可以调节图块间距、让图块随图窗大小重排,并为颜色栏和图例提供更合理的摆放方式[1]。官方说明同时指出,tiledlayout具备subplot不支持的若干能力,而直接改动subplot会带来向后兼容问题,因此选择以新函数的形式提供。

应用

subplot最常见的用途是在单张图窗中并排比较多组曲线。例如在2行1列布局的上半部分绘制一条正弦波、下半部分绘制频率更高的正弦波,只需依次调用subplot(2,1,1)与subplot(2,1,2)。用subplot(2,2,p)可以做出四象限布局,并为每个子图分别添加标题,这在对照不同频率、不同参数曲线的表现时十分直观。

当子图尺寸不必相等时,可让p取向量实现跨格。文档示例用subplot(2,2,1)与subplot(2,2,2)在上半部分放两个小图,再用subplot(2,2,[3,4])在下方放置一个横跨两列的图,用于把余弦曲线与其多项式近似画在一起对照。在循环中配合subplot(2,2,k)还能批量生成子图,例如为4组随机数据分别绘制针状图。

对于不能落在规则网格上的版面,subplot('Position',pos)允许直接指定矩形位置,文档示例给出pos1 = [0.1 0.3 0.3 0.3]与pos2 = [0.5 0.15 0.4 0.7]这类写法。此外,subplot(m,n,p,ax)可以把已有的坐标区转换为同一图窗中的子图,subplot(ax)则把指定坐标区设为父图窗的当前坐标区。

局限

subplot对子图间距的控制能力有限。默认布局会在每个绘图框周围留出较大空白,而函数本身没有直接设置边距或间距的参数,MATLAB官方答复也确认此前并不提供设置子图边距的功能,只能改为手动调整坐标区的Position属性,或使用subaxis、tight_subplot等社区函数。把间距压得过紧又会带来新问题:相邻子图的刻度标签容易互相重叠,因此压缩边距需要权衡。

共享标注也是subplot的短板。跨越整个坐标区阵列的公共标题、公共坐标轴标签以及统一的颜色栏与图例,在subplot框架下需要手工摆放,官方说明将其列为tiledlayout的优势之一。在较早版本中,为多个子图配置一个共用颜色栏只能借助subplot配合Position属性拼凑,直到R2020b这类共享颜色栏的摆放才在新布局对象中得到较好支持。

坐标区重叠时的处理规则也需留意:若新的subplot规格使新建坐标区与已有坐标区重叠,原有坐标区会被删除;而若位置与已有坐标区完全吻合,则不会重建,只把该坐标区设为当前坐标区[2]。因此先subplot占位、再逐个调整Position时,容易因后续调用覆盖已调整好的图,稳妥做法是先完成全部subplot并保存句柄,再统一重排。

参见

  • tiledlayout —— R2019b引入的图块布局函数,官方推荐用以替代subplot排布多个坐标区。

  • nexttile —— 与tiledlayout配套使用、用于逐个创建图块的函数。

  • 坐标区 —— subplot每次调用所创建的图形对象,绘图内容都绘制在其中。

  • MATLAB —— subplot所属的科学计算与可视化软件环境。

  • 数据可视化 —— subplot所服务的主要应用方向。

参考资料

  1. tiledlayout [引用日期2026-10-29]
  2. subplot [引用日期2026-10-29]
  3. subplot [引用日期2026-10-29]
  4. A history of MATLAB [引用日期2026-10-29]
词条评价
词条统计

浏览次数:0 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-28T18:23:59Z

历史版本

本条目引用的词条
MATLAB Cleve Moler tiledlayout nexttile 坐标区 数据可视化