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
ω=5,7,9,11,13,15,17,很多人看到这里就会说这非常简单直接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
- 例如要修改一个figure 的大小就得使用这个语句:
set(gcf,'Position',[x,y,width,height]) ,这里的
x
,
y
x,y
x,y 分别表示 figure 在电脑屏幕的哪个位置也是从左下角为坐标原点建立图像。 - 修改
subplot() 中子图的大小位置和 figure 的类似语句:(1)间接法:利用 set(gca,'Position',[x,y,width,height]) 间接固定位置;(2)直接法:直接固定位置 subplot('Position',[x y width height]) - 个人推荐直接法,后面会详细描述间接法存在的一些弊端。
2.3 代码实践
- 直接法,是不是突然发现刚才的图在更改固定好位置之后发生了改变,图变得很好看了。
直接法代码:
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
- 间接法,可以看到一个很奇怪的现象就是第六张子图消失了,为什么会出现这个现象,接下来就展开探秘。
间接法代码:
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 间接法问题探究
-
首先使用 matlab 断点寻找为什么这个第6张子图凭空消失了,一步一步的运行这里会发现其实在绘制图6时可以看到6图已经绘制出来了,但开始绘制图7时发生了一个事情是它把图六给覆盖掉了导致了这个现象的发生。 -
间接法画图的顺序是这样的,subplot() 绘制好位置后,这里的位置一般是matlab的默认位置,这样就会导致会存在这种覆盖问题,所以解决办法有两种,改变 x 的位置,还有就是x不变改变 width,这种都太复杂。所以我推荐直接法去固定子图像位置。 非常感谢这个大佬的思路建议,希望读者看完后有跟多其他的想法,开拓思维。 -
本人还找了一位大佬(slandarer:CSDN链接,大家可以去看看这位大佬的文章会有很多编程的启发)在matlab画图这一块有很多博文,与他沟通之后,他找到了这个也是相同问题。大佬给出了另一种画图方法就是先画完所有图后再定子图位置,我的思路是画一个子图定一个位置。
参考文章
- Matlab——调整子图位置,使子图紧凑: https://zhuanlan.zhihu.com/p/454068545
|