Matlab 中 subplot 子图任意位置调整

0. 引言

  利用 matlab 绘制子图的时候偶尔会觉得matlab默认的子图与子图之间的间距不那么的好看,导致会让人去调整这些子图的位置。那么本章主要讲的是,本人在调整这些子图遇到的问题与心得。

注意: 本人使用的 matlab 版本为:2020a

1. 举例

  举一个最简单的画图例子,绘制画一个 f ( x ) = s i n ( ω t ) f(x)=sin(\omega t) f(x)=sin(ωt),其中 ω = 5 , 7 , 9 , 11 , 13 , 15 , 17 \omega=5,7,9,11,13,15,17 ω=57911131517,很多人看到这里就会说这非常简单直接subplot(1,7,i),或者subplot(7,1,i),那本人就画出来看一下效果如何。
在这里插入图片描述
在这里插入图片描述

附上这个图的代码:

clc
clear all
close all

t=0:0.001:2*pi;    % 时间 t
omega = 5:2:17;    % ω 取值
xname = {
    
    'F_1(x)','F_{2}(x)','F_{3}(x)','F_4(x)','F_5(x)','F_6(x)','F_7(x)'};   % 定义一个元胞数组之后画图标题用的
figure
for i=1:7
    f = sin(omega(i).*t);     % 绘制函数图像 f(x)=sin(ωt)
    subplot(1,7,i)            % 绘制一个1×7的子图
    plot(t,f,'r') 
    title([char(xname(i)),'=sin(',num2str(omega(i)),'t)'])
    ylim([-1.1,1.1])
    xlim([0,pi/2])
    xticks([0,pi/4,pi/2])
    xticklabels({
    
    '0','\pi/4','\pi/2'})         % x轴刻度
    yticks([[],[],[]])  
end

可以看到看到图像被拉伸或着压缩的很难看,那如何可以调整这些子图的大小以及位置

2. 调整子图位置及大小

  参考文章中提供了三种方法,本人觉得三种方法都很可以,对于除了手动调试的两种方法都是自动智能,但是这些智能的都不能达到自己想要的效果这么办,本人还没想到很好的解决方案。这里主要介绍 Position 方法。

2.1 Position 调整子图位置及大小

首先,点中这个小鼠标
在这里插入图片描述
再点击其中任意一个小子图,会出现被选中的样子
在这里插入图片描述
点击那个鼠标旁边的那个属性编辑框
在这里插入图片描述
找到样式中的位置选项,并找到 Position ,点击竖着的三个小点
在这里插入图片描述
然后出现这这一个小框 里面包含了 position 的四个属性

  • x: 表示 子图的左下角 x 轴向位置
  • y: 表示 子图的左下角 y 轴向位置
  • width: 表示 子图的宽度
  • height: 表示 子图的长度
    在这里插入图片描述
    在这里插入图片描述
    接下来为了美观那就得固定每个 宽度 和 长度,这些设置得靠自己去尝试修改得到自己想要得

2.2 通过程序修改 position

  1. 例如要修改一个figure 的大小就得使用这个语句:set(gcf,'Position',[x,y,width,height]),这里的 x , y x,y x,y 分别表示 figure 在电脑屏幕的哪个位置也是从左下角为坐标原点建立图像。
  2. 修改 subplot() 中子图的大小位置和 figure 的类似语句:(1)间接法:利用 set(gca,'Position',[x,y,width,height]) 间接固定位置;(2)直接法:直接固定位置 subplot('Position',[x y width height])
  3. 个人推荐直接法,后面会详细描述间接法存在的一些弊端。

2.3 代码实践

  1. 直接法,是不是突然发现刚才的图在更改固定好位置之后发生了改变,图变得很好看了。
    在这里插入图片描述
    直接法代码:
clc
clear all
close all
t=0:0.001:2*pi;
omega = 5:2:17;
xname = {
    
    'F_1(x)','F_{2}(x)','F_{3}(x)','F_4(x)','F_5(x)','F_6(x)','F_7(x)'};

x=0.0256:0.14:0.8656;
y = 0.38*ones(7,1);
figure
set(gcf,'Position',[19,107,900,400])
for i=1:7
    f = sin(omega(i).*t);
    subplot('Position',[x(i) y(i) 0.11 0.2])
    plot(t,f,'r') 
    title([char(xname(i)),'=sin(',num2str(omega(i)),'t)'])
    ylim([-1.1,1.1])
    xlim([0,pi/2])
    xticks([0,pi/4,pi/2])
    xticklabels({
    
    '0','\pi/4','\pi/2'})
    yticks([[],[],[]])  
end
  1. 间接法,可以看到一个很奇怪的现象就是第六张子图消失了,为什么会出现这个现象,接下来就展开探秘。
    在这里插入图片描述
    间接法代码:
clc
clear all
close all

t=0:0.001:2*pi;
omega = 5:2:17;
xname = {
    
    'F_1(x)','F_{2}(x)','F_{3}(x)','F_4(x)','F_5(x)','F_6(x)','F_7(x)'};

x=0.0256:0.14:0.8656;
y = 0.38*ones(7,1);
figure
set(gcf,'Position',[19,107,900,400])
for i=1:7
    f = sin(omega(i).*t);
%     subplot('Position',[x(i) y(i) 0.11 0.2])
    subplot(1,7,i)
    set(gca,'Position',[x(i) y(i) 0.11 0.2])
    plot(t,f,'r') 
    title([char(xname(i)),'=sin(',num2str(omega(i)),'t)'])
    ylim([-1.1,1.1])
    xlim([0,pi/2])
    xticks([0,pi/4,pi/2])
    xticklabels({
    
    '0','\pi/4','\pi/2'})
    yticks([[],[],[]])  
end

2.4 间接法问题探究

  1. 首先使用 matlab 断点寻找为什么这个第6张子图凭空消失了,一步一步的运行这里会发现其实在绘制图6时可以看到6图已经绘制出来了,但开始绘制图7时发生了一个事情是它把图六给覆盖掉了导致了这个现象的发生。
    在这里插入图片描述在这里插入图片描述

  2. 间接法画图的顺序是这样的,subplot() 绘制好位置后,这里的位置一般是matlab的默认位置,这样就会导致会存在这种覆盖问题,所以解决办法有两种,改变 x 的位置,还有就是x不变改变 width,这种都太复杂。所以我推荐直接法去固定子图像位置。 非常感谢这个大佬的思路建议,希望读者看完后有跟多其他的想法,开拓思维。

  3. 本人还找了一位大佬(slandarer:CSDN链接,大家可以去看看这位大佬的文章会有很多编程的启发)在matlab画图这一块有很多博文,与他沟通之后,他找到了这个也是相同问题。大佬给出了另一种画图方法就是先画完所有图后再定子图位置,我的思路是画一个子图定一个位置。

在这里插入图片描述

参考文章

  1. Matlab——调整子图位置,使子图紧凑: https://zhuanlan.zhihu.com/p/454068545

猜你喜欢

转载自blog.csdn.net/cugautozp/article/details/124780250