你有没有过这种经历?想在Matlab里把几个不同的实验结果放在同一个窗口对比,结果要么图和图挤在一起,要么标题重叠得看不清,要么位置乱得像打翻了的积木?别慌!今天咱们就来解锁subplot这个宝藏函数——它能帮你轻松搞定多子图布局,从基础的网格排列到进阶的自定义大小,包教包会,看完就能上手!
subplot的核心用法其实超简单,一句话就能说清:subplot(m,n,p)。这三个参数分别代表什么?听我慢慢道来:
举个例子,subplot(2,2,3)就是说:把整个窗口分成2行2列共4个格子,我现在要画的图放在第3个格子里。等等,位置怎么数?这里有个关键规则——行优先!也就是先从第一行左边开始数1、2,再跳到第二行左边数3、4,就像读书时从左到右、从上到下的顺序(超级重要,别数反了!)。
咱们来写个最简单的代码试试: ```matlab % 生成数据 x = linspace(0, 2pi, 100); y1 = sin(x); y2 = cos(x); y3 = tan(x); y4 = exp(-x).sin(5*x);
% 画四个子图 figure('Name','基础网格布局'); subplot(2,2,1); plot(x,y1); title('正弦函数'); grid on; subplot(2,2,2); plot(x,y2); title('余弦函数'); grid on; subplot(2,2,3); plot(x,y3); ylim([-5,5]); title('正切函数'); grid on; subplot(2,2,4); plot(x,y4); title('衰减振荡'); grid on; ``` 运行这段代码,你会看到四个图整整齐齐地排列在窗口里,每个图都有自己的标题和网格线,是不是瞬间清爽多了?
我刚开始用subplot的时候,也踩过不少坑,现在把这些血泪教训分享给你,省得你走弯路:
有时候你会发现,相邻子图的标题和坐标轴标签重叠了,看着特别难受。这时候可以用sgtitle给整个figure加个大标题,再用xlabel/ylabel时适当调整字号,或者用set函数手动移动位置。比如:
matlab
figure;
subplot(2,2,1); plot(x,y1); title('正弦','FontSize',10); % 缩小标题字号
subplot(2,2,2); plot(x,y2); title('余弦','FontSize',10);
subplot(2,2,3); plot(x,y3); ylim([-5,5]); title('正切','FontSize',10);
subplot(2,2,4); plot(x,y4); title('衰减振荡','FontSize',10);
sgtitle('三角函数与指数函数对比'); % 加全局标题
默认的间距有时候不太理想,这时候可以用subplot的Position参数手动调整。比如subplot('Position',[left, bottom, width, height]),这四个数值都是0到1之间的比例(相对于整个figure的大小): - left:子图左边距离figure左边的比例 - bottom:子图下边距离figure下边的比例 - width:子图宽度占figure的比例 - height:子图高度占figure的比例
举个例子,我想让左边的图宽一点,右边的窄一点:
matlab
figure;
% 左边的图:占满左边一半
subplot('Position',[0.1, 0.1, 0.4, 0.8]); plot(x,y1); title('左边大图');
% 右边的图:占右边一半,分成上下两个
subplot('Position',[0.6, 0.55, 0.35, 0.35]); plot(x,y2); title('右上小图');
subplot('Position',[0.6, 0.1, 0.35, 0.35]); plot(x,y3); title('右下小图');
这样就能做出左边一个大图、右边两个小图的布局,是不是很灵活?
有时候你需要一个图占满整个第一行,剩下的图在第二行排列。这时候可以用合并位置的技巧——把p参数写成一个数组,比如subplot(3,3,[1 2 4 5]),意思是这个图占第1、2列和第1、2行的四个格子,也就是左上角的大区域。
来个例子:
matlab
figure;
% 左上角大图:占2行2列
subplot(3,3,[1 2 4 5]); plot(x,y1); title('大正弦图');
% 右边三个小图
subplot(3,3,3); plot(x,y2); title('余弦');
subplot(3,3,6); plot(x,y3); title('正切');
subplot(3,3,9); plot(x,y4); title('指数');
运行后你会看到,左上角的图明显比其他图大,这样就能突出重点数据啦!
光会放图还不够,咱们得让图看起来更专业。这里有几个小技巧,亲测有效:
有时候不同子图的y轴范围不一样,对比起来不方便。这时候可以用ylim或xlim统一设置,比如:
matlab
subplot(2,2,1); plot(x,y1); ylim([-1,1]);
subplot(2,2,2); plot(x,y2); ylim([-1,1]);
这样两个图的y轴就都在-1到1之间,对比起来更直观。
如果多个子图的x轴或y轴代表同一个意思,没必要每个都标。比如所有子图的x轴都是时间,那可以只给最下面一行的子图标xlabel,最左边一列的标ylabel。用set函数可以隐藏不需要的标签:
matlab
subplot(2,2,1); plot(x,y1); title('图1'); set(gca,'XTickLabel',[]); % 隐藏x轴标签
subplot(2,2,2); plot(x,y2); title('图2'); set(gca,'XTickLabel',[]); set(gca,'YTickLabel',[]); % 隐藏x和y标签
subplot(2,2,3); plot(x,y3); xlabel('时间(s)'); % 只标x轴
subplot(2,2,4); plot(x,y4); xlabel('时间(s)'); set(gca,'YTickLabel',[]); % 标x轴,隐藏y轴
这样整个布局会更简洁,不会显得杂乱。
Matlab默认的子图间距有时候不太友好,这时候可以用subplotspacing来调整。比如:
matlab
figure;
set(gcf,'Units','Normalized','Position',[0.1,0.1,0.8,0.8]); % 设置figure大小
set(gcf,'DefaultSubplotPosition',[0.1,0.1,0.8,0.8]); % 调整子图位置
subplot(2,2,1); plot(x,y1);
subplot(2,2,2); plot(x,y2);
% 或者用更直接的方法:
subplot(2,2,3); plot(x,y3);
subplot(2,2,4); plot(x,y4);
set(gcf,'SubplotSpacing',0.1); % 调整间距为0.1(0到1之间)
这样子图之间的空隙会更合适,不会太挤也不会太松。
最后咱们来个实战,用subplot做一个完整的数据分析图。比如我想展示一组数据的分布:左边一个大的散点图,右边两个小的直方图(分别展示x和y的分布)。代码如下: ```matlab % 生成随机数据 data_x = randn(1000,1); data_y = 2*data_x + randn(1000,1);
% 创建figure figure('Name','数据分布分析'); set(gcf,'Position',[100,100,800,500]); % 设置窗口大小
% 左边大散点图:占2行1列的左边区域 subplot(2,2,[1 3]); scatter(data_x, data_y, 10, 'filled'); title('X-Y散点图'); xlabel('X值'); ylabel('Y值'); grid on;
% 右上直方图:X的分布 subplot(2,2,2); histogram(data_x, 20); title('X的分布'); xlabel('X值'); ylabel('频数');
% 右下直方图:Y的分布 subplot(2,2,4); histogram(data_y,20); title('Y的分布'); xlabel('Y值'); ylabel('频数');
% 调整间距 set(gcf,'SubplotSpacing',0.15); ``` 运行这段代码,你会得到一个看起来非常专业的分析图:左边是数据的散点关系,右边是两个变量的分布情况,一目了然!
其实subplot的用法远不止这些,只要你多试几次,就能发现更多好玩的技巧。比如和hold on结合画叠加图,或者用colorbar给子图加颜色条,甚至用它来做动态图的布局。
我想告诉大家的是:subplot不是死板的工具,而是灵活的画笔。你想怎么排列图,它就能帮你实现——关键是多动手、多尝试。
最后,给大家留个小作业:用subplot画一个3行3列的布局,其中中间的图占满整个第二行,其他图各占一个格子。试试看,你能做到吗?
好了,今天的分享就到这里。希望这篇文章能帮你搞定Matlab的多图布局问题。赶紧打开Matlab,自己动手试试吧——相信我,当你看到自己画的图整整齐齐排列在屏幕上时,那种成就感真的很棒!
下次再见啦,祝大家画图愉快!