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…...

小程序云开发CMS新版数据模型讲解,可视化网页管理后台,内容管理对数据库进行增删改查操作,新闻小程序实战学习
一直跟着石头哥学习小程序开发的同学比较清楚cms是什么,cms就是可以进行可视化的管理云开发数据库的网页后台。有了cms我们可以很方便的管理云开发数据库。 但是云开发官方一直改版,所以现在cms功能被整合到了云开发的数据模型里,也就是现在想…...

undertow服务器初始化
springboot整合undertow服务器的源码从老生常谈的createWebServer方法谈起。spring会在生成所有bean后到创建web容器,此时会到容器找到ServletWebServerFactory接口bean,spring会根据引入的框架确定生成的ServletWebServerFactory,我们在mave…...

LeetCode9:回文数
原题地址:. - 力扣(LeetCode) 题目描述: 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数 是指正序(从左向右)和倒序ÿ…...

模板语法(2)
一、循环 在模板中可以用v-for指令来循环数组,对象等。 1. 循环数组 <script setup name"App">import { reactive } from "vue"const books reactive([{title: 三国演义,author: 罗贯中}, {title: 水浒传,author: 施耐庵}, {title: 西…...

从头学PHP之数组输出基本函数
上期我们讲到了数组,数组是个特殊的变量,在程序中的重要程度很高,大部分数据处理的时候会用到这种特殊的变量,那么现在让我们继续深入一下吧。 上期我们打印出了数组的值,用print_r()或者var_dump()这俩函数࿰…...

基于SSM+小程序的4S店客户管理系统(汽车2)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 4S店客户管理系统主要包括管理员、用户、门店三个权限角色 1、管理员实现了首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、…...

ZYNQ AXI_Timer 中断
REVIEW 关于ZYNQ中断: ZYNQ PS_GPIO中断-CSDN博客 ZYNQ AXI_GPIO_INT-CSDN博客 ZYNQ 定时器中断-CSDN博客 在一些应用场景中,可能需要使用到多个定时器,除了选择使用 PS 侧其他定时器外,也可以使用 PL 侧逻辑定时器。 1. 今日摸鱼…...

UE5之5.4 第一人称示例代码阅读2 子弹发射逻辑
TP_WeaponComponent.h 看看头文件 暴露了attach weapon和fire给蓝图 这两个函数意义一看名字吧,就是捡起来枪的时候执行,一个就是发射子弹的时候执行 #pragma once#include "CoreMinimal.h" #include "Components/SkeletalMeshComponen…...

Python 实现日期计算与日历格式化输出(万年历)
目录 一、引言 二、需求分析 三、实现思路 四、代码实现 五、代码分析 六、测试与验证 七、总结与展望 在日常的编程中,我们经常会遇到与日期相关的问题,比如计算两个日期之间的天数差、确定某个特定日期是星期几以及格式化输出日历等。本文将详细…...

10.28.2024刷华为OD C题型
文章目录 HJ9HJ10HJ11HJ13HJ17 HJ9 HJ10 HJ11 HJ13 HJ17...