030_Subplot_In_Matlab中多图绘制之subplot函数

基于子图的多图方法
专业的论文中通常涉及到多个有逻辑关系的图拼接在一起,构成相互支持或者对照。所以很早之前,Matlab就有这个子图的函数subplot。
这个函数的基本语义有三类:
- 在图窗上划分出一个矩形区域建立一个坐标系,并指定该坐标系为当前坐标系
- 把一个坐标系替换成另外一个坐标系,并指定为当前坐标系
- 把一个坐标系指定为当前坐标系
因为Matlab的绘图指令可以忽略坐标系参数,并利用gca函数获取当前坐标系。所以当运行上述子图函数后,后续不指定坐标系的绘图指令就会在指定的坐标系上进行。
基于格子的多图方法
% 基本的子图:利用subplot函数,并用函数语法画图
figure;
% 1. 画一个2x2的子图
subplot(2,2,1);
plot(1:10,1:10);
title('1');subplot(2,2,2);
plot(1:10,1:10);
title('2');subplot(2,2,3);
plot(1:10,1:10);
title('3');subplot(2,2,4);
plot(1:10,1:10);
title('4');

简单的说,子图的编号采取了行先的方式,下面给出一个循环的例子,可以看到,图号按照n * i + j的方式编号,其中n是行数,i是行号,j是列号。
figure;m = 2; % 行数
n = 3; % 列数for row = 1:mfor col = 1:nidx = (row-1)*n + col;subplot(m,n,idx);plot(1:10,1:10);title(['子图编号' num2str(idx)]);end
end

实际上,子图可以拼凑在一起,比如下面这个例子中,把第一行的两个图绘制完成后;再创建一个两行一列的图,把第二行的子图作为一个子图。就形成了三个子图的图像。
% 稍微复杂的子图:利用subplot函数,并用函数语法画图
figure;
% 1. 画一个2x2的子图
ax1 = subplot(2,2,1);
plot(ax1,1:10,1:10);
title(ax1,'1');ax2 = subplot(2,2,2);
plot(ax2,1:10,1:10);
title(ax2,'2');% 一个2x1的格子,横跨两列的子图
ax3 = subplot(2,1,2);
plot(ax3,1:10,1:10);
title(ax3,'3');

当然,从下面的例子可以看到,当有两个子图发生重叠时,就把先绘制的那个子图删除替换成新的子图。这里,先把第一行的两个子图绘制完成后,再绘制第二列的一个子图,这样就把第一行的第二个子图删除了。当然,左下角子图也可以顺利添加进来。
% 稍微复杂的子图:利用subplot函数,并用函数语法画图
figure;
% 1. 画一个2x2的子图
ax1 = subplot(2,2,1);
plot(ax1,1:10,1:10);
title(ax1,'1');ax2 = subplot(2,2,2);
plot(ax2,1:10,1:10);
title(ax2,'2');% 一个1x2的格子,横跨两列的子图(删除了2,2,2对应的坐标系)
ax3 = subplot(1,2,2);
plot(ax3,1:10,1:10);
title(ax3,'3');ax4 = subplot(2,2,3);
plot(ax4,1:10,1:10);
title(ax4,'4');

按照位置的多图方法
除了按照简单的行先编号的方式来创建子图坐标系,还可以直接设定子图的位置和大小还创建坐标系,这里就可以使用Position属性来设置子图,跟所有的Position属性一样,这里的位置包括了左下角的位置、宽度和高度。当然,这里采用的单位是归一化的单位,也就是左下角为(0, 0),右上角为(1, 1)。
figure;
ax1 = subplot("Position", [0.1 0.1 0.4 0.4]);
plot(1:10,1:10);
title('1');ax2 = subplot("Position", [0.5 0.5 0.3 0.3]);
plot(1:10,1:10);
title('2');ax3 = subplot("Position", [0.8 0.8 0.1 0.1]);
plot(1:10,1:10);
title('3');

这里有同样的问题,把上面脚本中子图坐标系的位置稍微调整一下就会发现,当有两个图重叠时,后绘制的图会把先绘制的图覆盖掉。
图中图的实现方法
当然,我知道你们在想什么,那么怎么绘制多个图,相互交叉(例如绘制部分放大图)呢?这就是图中图(画中画)的概念。要实现这个也很简单。
直接调整子图坐标系
那这样一想,我们能不能先分快创建子图坐标系,然后在调整Position属性来调整子图的位置呢?当然可以,下面的例子就是这样做的。
figure;
ax1 = subplot(2,2,1);
plot(1:10,1:10);
title('1');ax2 = subplot(2,2,2);
plot(1:10,1:10);
title('2');ax3 = subplot(2,2,3);
plot(1:10,1:10);
title('3');ax4 = subplot(2,2,4);
plot(1:10,1:10);
title('4');ax1.Position = [0.15, 0.5, 0.5, 0.3];
ax2.Position = [0.75, 0.5, 0.2, 0.3];
ax3.Position = [0.1, 0.1, 0.8, 0.8];
ax3.Color = 'none';

创建子图坐标系
是否可以直接创建子图坐标系呢?当然可以,下面的例子就是这样做的。
只需要把subplot换成axes就可以,这个时候,就按照位置定位的方式来创建坐标系,通过把坐标系的背景颜色设置为none,就能把一个坐标系设定为透明。下面比较了是否设置为透明的效果。
f = figure;
ax1 = axes("Position", [0.1 0.1 0.4 0.4]);
plot(1:10,1:10);
title('1');ax2 = axes("Position", [0.45 0.45 0.3 0.3], 'Color', 'y');
plot(1:10,1:10);
title('2');ax3 = axes("Position", [0.7 0.7 0.1 0.1], 'Color', 'g');
plot(1:10,1:10);
title('3');ax4 = axes("Position", [0.2 0.2 0.7 0.7]);
x = 0:0.01:2*pi;
y = sin(x);
plot(x, y);
title('4');ax1.Color = 'r';
ax2.Color = 'g';
ax3.Color = 'y';
ax4.Color = 'none';exportgraphics(f, 'colors.png');

严肃一点,我们真正的做一个图中图,也就是对一个图的局部进行放大。
x = 0:0.01:2*pi;
y = sin(x);% 绘制一个图像
figure;
plot(x, y);
xlabel('x');
ylabel('y');
title('y = sin(x)');% 增加一个坐标在pi/2处的放大图ax1 = axes("Position", [0.6 0.6 0.2 0.2]);
idx = x >= pi/2-0.1 & x <= pi/2+0.1;
plot(x(idx), y(idx));
title('Zoomed view', Color='r');
xlim([pi/2-0.1, pi/2+0.1]);
ylim([0.9, 1.1]);% 绘制一个箭头,指向放大区域
annotation('arrow', X=[0.58 0.35], Y=[0.75 0.9]);
annotation('rectangle', [0.285 0.9 0.05 0.05]);

这里比较烦人的就是要手动调整标注(箭头、方框)的位置,而且这个坐标是针对整个图的,不是针对子图的,也就是左小角坐标是(0,0),右上角坐标(1,1),宽度和高度的范围都是[0, 1]。
新的多图方法预告
从2022b开始就,一种新的、更加清晰的多图方法出现了。后面再写一个文章详细介绍这个方法。
相关文章:
030_Subplot_In_Matlab中多图绘制之subplot函数
基于子图的多图方法 专业的论文中通常涉及到多个有逻辑关系的图拼接在一起,构成相互支持或者对照。所以很早之前,Matlab就有这个子图的函数subplot。 这个函数的基本语义有三类: 在图窗上划分出一个矩形区域建立一个坐标系,并指…...
免费云服务器有什么使用限制和注意事项?
在数字化时代,云计算已经成为许多企业和个人用户的重要工具。对于初创企业、开发者和学生来说,免费的云服务器提供了一个低成本的解决方案,使他们能够进行项目开发、学习和实验。但在使用过程中也存在一些限制和注意事项。以下是主要的使用限…...
3-ZYNQ 折腾记录 -PS_PL AXI Interfaces
Zynq UltraScale MPSoC集成了功能丰富的四核或双核Arm Cortex-A53 MPCore基于处理系统(Processing System, PS)和可编程逻辑(Programmable Logic, PL)的单一设备。 PS和PL可以使用多个接口和其他信号进行紧密或松散的耦合。这使设计人员能够有效地将用户创建的硬件加速器和其他…...
总结test
1.IO流 |-- 字节流操作任何类型文件|-- 字符流操作纯字符类文件|-- BIO 传统IO流,阻塞型的,也就是BIO,当执行IO流时,CPU只能等待执行完当前任务,才能去执行其他线程任务|-- NIO非阻塞型IO流,CPU可以同时执行…...
在 On hold 期刊 eLife 上发表一篇生信文章需要什么工作量?
生信碱移 科研圈动态 根据弗雷赛斯以及相关媒体最新消息,中科院一区TOP,著名生命科学期刊 eLife [IF: 6.4]已被科睿唯安官方 On hold! ▲ 官网截图。图片来源:https://mjl.clarivate.com/home eLife是一本专注于生物医学和生命科…...
使用Django框架开发企业级Web应用
💖 博客主页:瑕疵的CSDN主页 💻 Gitee主页:瑕疵的gitee主页 🚀 文章专栏:《热点资讯》 使用Django框架开发企业级Web应用 1 引言 2 Django简介 3 安装Python与Django 4 创建Django项目 5 设计应用结构 6 创…...
认识线程 — JavaEE
目录 认识线程(Thread) 1 线程是什么? 2 为什么要有线程 3 进程和线程的区别 区别一 区别二 区别三 区别四 4. Java的线程和操作系统线程的关系 认识线程(Thread) 1 线程是什么? 一个线程就是一个 "执行流"。…...
【C++单调栈】853. 车队|1678
本文涉及的基础知识点 C单调栈 LeetCode853. 车队 在一条单行道上,有 n 辆车开往同一目的地。目的地是几英里以外的 target 。 给定两个整数数组 position 和 speed ,长度都是 n ,其中 position[i] 是第 i 辆车的位置, speed[i…...
第十届文荣奖华丽开幕,郁葱以青春与努力绽放青年演员光芒
10月27日,第十届文荣奖在众人的期待中盛大开启,内地青年女演员郁葱受邀出席,作为国内颇具影响力的影视奖项,文荣奖一直以来都致力于发掘和表彰优秀的影视作品和青年影视人才,为影视行业的发展注入新的活力,…...
CMake 生成器表达式介绍
【写在前面】 生成器表达式在构建系统生成期间进行评估,以生成特定于每个构建配置的信息。它们的形式为 $<...>。例如: target_include_directories(tgt PRIVATE /opt/include/$<CXX_COMPILER_ID>) 这将扩展为 “/opt/include/GNU”、“/opt…...
ubuntu 20.04编译驱动报gcc-12 not found错误
最近在自己安装的Ubuntu 系统上编译自定义驱动,发现无法编译.ko,错误如下: 按照如下操作,发现可以解决,记录下,主要是Ubuntu缺少g-12的包 安装包以后发现可以正常编译...
docker sameersbn/bind dns服务器
1. 安装 #下载docker 镜像 docker pull sameersbn/bind#运行 53端口若被占用会启动失败 docker run --name dns -d --restartalways \ --publish 53:53/tcp \ --publish 53:53/udp \ --publish 10000:10000/tcp \ -v /etc/localtime:/etc/localtime \ -v /data/bind/:/data \…...
错误:无法推送一些引用到 ‘https://gitee.com/chek_kk/python-electron-app.git‘
这个错误提示说明在提交时某个文件的大小超过了 Gitee 仓库的单文件大小限制(100MB)。你需要从Git 历史中彻底移除这个大文件,否则无法推送到远程仓库。 解决步骤 1. 确认大文件信息 使用以下命令找出超过限制的大文件: git re…...
深度剖析美区代理IP的多元应用与优势
在当今数字时代,代理IP(Proxy IP)已成为互联网使用中的一项关键技术。尤其在美区,代理IP在数据采集、网络安全及在线隐私保护等领域发挥着越来越重要的作用。本文将深入探讨代理IP的基本概念、应用场景以及它带来的诸多优势&#…...
基于KV260的基础视频链路通路(MIPI+Demosaic+VDMA)
目录 1. 简介 1.1 要点 1.2 背景 1.2.1 Got stuck 1.2.2 Cant be Initialized 2. Overlay 2.1 参考 Overlay 2.1.1 KV260 Base 2.1.2 Pynq-CV-OV5640 2.2 自建 Overlay 2.2.1 IIC IP 2.2.2 MIPI CSI-2 Rx 2.2.3 AXI4-S Subset 2.2.4 Demosaic 2.2.5 Pixel Pack …...
Uni-App-04
主页开发 保存主页数据 <script> import { indexData, base } from /serviceexport default {data() {return {base, //把服务器基础地址变量设置为数据属性carousels:[], //轮播广告条目列表menuItems:[], //当前用户选中的功能菜单列表activities:[], //最新的…...
ElasticSearch分片
本文内容参考了田雪松老师编著的《Elastic Stack应用宝典》 ElasticSearch作为一个搜索引擎,会存储海量的数据。而存储海量的数据,就要解决如何存储的问题,并且保证数据不会丢失,同时还需要保证数据检索的效率,尽可能…...
spring高手之路
以下是一些可以快速入门Spring的方法: 1. 学习基础知识 阅读官方文档:Spring官方文档是最权威的学习资料。它详细介绍了Spring的各个模块、概念和使用方法。从核心模块开始,了解如依赖注入(DI)和控制反转(…...
工字钢与H型钢有什么区别?90%的工程师都搞错了!
这里为大家做一个详尽的解答:很多人认为工字钢是国内的叫法,H型钢是国外的叫法,其实这个认知是错误的。H型钢和工字钢从形状上来说是不一样的,见下图: 工字钢 工字钢主要分为普通工字钢、轻型工字钢和宽翼缘工字钢。按…...
10个程序员可以接私活的平台(非常详细)零基础入门到精通,收藏这篇就够了
私活接的好收入不比上班少,一些同学靠接私活月收入也上万甚至几万了。今天老韩来分享一下有哪些接私活的网站和平台,转发收藏以后备用 我们先来聊聊什么样的私活不能接。。 1、没有第三方担保的个人对个人的尽量不要接,双方都没保障&#x…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
