MATLAB绘图高级教程:复杂数据图叠加、hold on使用及子图布局调整‌

一、利用棋盘格思想创建freestyle的子图

先聊在MATLAB里如何正确地创建子图——即正确使用函数。

首先来看函数的说明文档:

subplot(m,n,p) 将当前图窗划分为m×n的网格,并在p指定的位置创建坐标区。按行号对子图位置进行编号。第一个子图是第一行的第一列,第二个子图是第一行的第二列,依此类推。

此外,subplot命令会将新创建的坐标区设为当前坐标区——可以认为是正在活动的坐标区;或者更直白地讲,就是你再运行一次plot函数之后图像默认出现的坐标区!

下面用一个简单的示意图来解释一下。图图想要绘制一张数据图,其位于整个画面的中下部位置。那么首先需要将整个figure大概分成一个3×3的网格,中下部对应的网格坐标是(3,3)。按照matlab内部的对应关系,这应该是第8个棋盘格。只要执行命令即可创建。

同理,再执行一个subplot(3,3,2)命令会在整个画面的中上部创建一个坐标区。

•上面的subplot(3,3,8)命令我们可以简写成subplot(338);

•subplot(3,3,2)& subplot(3,3,8)两条命令我们可以一起合并写成subplot(3,3,[2 8])

有了上面的思路我们就可以创建各种各样的坐标区进行绘制,对子图的位置和形式也不再有限制!!

下方给出一个示例,利用“棋盘格”的思想进行subplot函数的布置!

%% 1 子图subplot
clear;clc;close all
figure % 创建一个图窗
x = 0:0.01:10;
y1 = x;
y2 = sin(x);
y3 = exp(x);
subplot(2,2,1) % 创建第一个子图
plot(x,y1)
subplot(2,2,[2 4]) % 创建第二个子图
plot(x,y3)
subplot(4,4,[9 10]) % 创建第三个子图
plot(x,y3/1000);
hold on
plot(x,y2)
plot(x,y1)
subplot(4,4,[13 14]) % 创建第三个子图
plot(x,y3/1000);
hold on
plot(x,y2)
plot(x,y1)

在命令行窗口输入:

可以打开编辑模式,进一步自由调整子图的位置和大小:

cut-off

二、你真的理解频频出现出现的hold on吗?

再来详细聊聊到底是什么,可能你在很多的MATLAB文件中看到过这个命令,但是却从来没有去深究过这个命令!

先来看看官方帮助文档的介绍:

hold on: 保留当前坐标区中的绘图,从而使新添加到坐标区中的绘图不会删除现有绘图。如果不存在坐标区,hold命令会创建坐标区。

从上面解释中我们可以得到下方信息:

•hold on针对的是一个坐标区(中的绘图);

•如果不加指明,指的就是当前坐标区;

•如果没有任何坐标区,hold on命令会新建一个坐标区。

听着有一些复杂,但是其实也很好理解,建议阅读一下图图前期的文章{戳这里是超链接}——关于一个figure窗口中所有对象的层次结构,并且牢牢记住当前图窗、当前坐标轴、当前对象这三个概念。有了上述三个概念,并且在每次绘图之前思考我的当前坐标轴是什么,就不会搞错了。

我们还是从简单的绘图看起,首先创建一些初始数据

clear;clc;close all
figure % 创建一个图窗
x = 0:0.01:10;
y1 = x;
y2 = sin(x);
y3 = exp(x);

接着我们绘制第一张图,此时hod on被注释掉了,我们发现应该出现两条线的图窗上仅出现了一条线。

plot(x,y1)
%hold on
plot(x,y2)

当我们绘制第二张图,此时hod on没有注释掉时,我们发现两条线都出现了。

plot(x,y1)
hold on
plot(x,y2)

以上的内容相信大家以前都已经非常熟悉,下面我们看看如果有多个子图怎么办。

首先创建一些子图,其中返回值ax1,ax2,ax3是对应子图的句柄(指针)。

ax1 = subplot(221);
ax2 = subplot(223);
ax3 = subplot(2,2,[2 4]);

分别用和不用hold on命令来在这些图窗上绘制图,看看会有什么结果:

clear;clc;close all
figure % 创建一个图窗
x = 0:0.01:10;
y1 = x;
y2 = sin(x);
y3 = exp(x);
ax1 = subplot(221);
ax2 = subplot(223);
ax3 = subplot(2,2,[2 4]);
plot(ax1,x,y1)
hold on
plot(ax1,x,y2)
plot(ax2,x,y1)
plot(ax2,x,y1)
plot(ax3,x,y2)
hold on
plot(ax3,x,y3/1000)

大家发现只有ax2对应的坐标区仅有一条线,而其他两个坐标区都有两条线,这就是hold on在起作用~

cut-off

三、复杂形式的数据图绘制案例

本推送属于绘图系列教程中非常重要的一环:介绍一组稍复杂的MATLAB绘图命令。

实现的示例图(demo)如下所示:

该图中结合了柱状图,折线图和散点图。其中:

  • 柱状图有渐变颜色的填充;
  • 折线图与柱状图分属两个不同的平面;
  • 散点图的Edge具有不同的颜色设置;
  • 含有观察视角的设置方式;

下面分块介绍代码:

A

% 初始化画布
% -------------------------------------------------------------------------
close all;clc;clear all
f=gcf;
f.Color='w';

f.Color='w';代表将图窗的颜色设置成了白色。

B

% 这里是绘图
% -------------------------------------------------------------------------
Z=6+4*rand(10,1); % 数据是随意的
Y=2+6*rand(10,1); % 数据是随意的
BarHandle=bar3([1:10],Z,0.7);
hold on
LineHandel=plot(Y,[1:10],'Color',[0 0 0],'LineWidth',1);
PointHandel=plot(Y,[1:10],'o','MarkerFaceColor','b',...
    'MarkerEdgeColor',[1 1 1]','LineWidth',2,'MarkerSize',8);

随机生成了一些数据进行绘制,其中BarHandle LineHandel PointHandel 三个分别是图形句柄(指针),方便后续控制点、线的样式。

C

% 绘图结束后控制数值
% -------------------------------------------------------------------------
AxesHandle=gca;
AxesHandle.XLim=[0 10];
AxesHandle.Box='on';

绘图后的数值控制。

D

% 绘图结束后控制颜色与位置
% -------------------------------------------------------------------------
map = [linspace(84,247,100)'/255 linspace(115,224,100)'/255 linspace(135,255,100)'/255];
colormap(map);
BarHandle.FaceColor = 'interp';
zdata = BarHandle.ZData;
BarHandle.CData = fix(zdata/2);
AxesHandle.XAxisLocation='origin';
AxesHandle.YAxisLocation='origin';

E

%==========================以下不是特别重要
grid on
AxesHandle.View=[121.6349,20.7235];
axis equal

坐标轴视角控制View属性。

完整代码

% 编写环境 R2019b
% 开发者: 图图@图通道
%
% 初始化画布
% -------------------------------------------------------------------------
close all;clc;clear all
f=gcf;
f.Color='w';
% 这里是绘图
% -------------------------------------------------------------------------
Z=6+4*rand(10,1); % 数据是随意的
Y=2+6*rand(10,1); % 数据是随意的
BarHandle=bar3([1:10],Z,0.7);
hold on
LineHandel=plot(Y,[1:10],'Color',[0 0 0],'LineWidth',1)
PointHandel=plot(Y,[1:10],'o','MarkerFaceColor','b',...
    'MarkerEdgeColor',[1 1 1]','LineWidth',2,'MarkerSize',8);
% 绘图结束后控制数值
% -------------------------------------------------------------------------
AxesHandle=gca;
AxesHandle.XLim=[0 10];
AxesHandle.Box='on';
% 绘图结束后控制颜色与位置
% -------------------------------------------------------------------------
map = [linspace(84,247,100)'/255 linspace(115,224,100)'/255 linspace(135,255,100)'/255];
colormap(map);
BarHandle.FaceColor = 'interp';
zdata = BarHandle.ZData;
BarHandle.CData = fix(zdata/2);
AxesHandle.XAxisLocation='origin';
AxesHandle.YAxisLocation='origin';
%==========================以下不是特别重要
grid on
AxesHandle.View=[121.6349,20.7235];
axis equal

完整的教程请关注公众号:图通道

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空