MATLAB绘图系列教程 | 复杂数据图叠加,hold on,子图布局调整
一、利用棋盘格思想创建freestyle的子图
先聊在MATLAB里如何正确地创建子图——即正确使用subplot
函数。
首先来看函数的说明文档:
subplot(m,n,p) 将当前图窗划分为m×n的网格,并在p指定的位置创建坐标区。按行号对子图位置进行编号。第一个子图是第一行的第一列,第二个子图是第一行的第二列,依此类推。
此外,subplot命令会将新创建的坐标区设为当前坐标区——可以认为是正在活动的坐标区;或者更直白地讲,就是你再运行一次plot函数之后图像默认出现的坐标区!
下面用一个简单的示意图来解释一下。图图想要绘制一张数据图,其位于整个画面的中下部位置。那么首先需要将整个figure大概分成一个3×3的网格,中下部对应的网格坐标是(3,3)。按照matlab内部的对应关系,这应该是第8个棋盘格。只要执行subplot(3,3,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函数的布置!

在命令行窗口输入:
>> plotedit on
可以打开编辑模式,进一步自由调整子图的位置和大小:


二、你真的理解频频出现出现的hold on吗?
再来详细聊聊hold on
到底是什么,可能你在很多的MATLAB文件中看到过这个命令,但是却从来没有去深究过这个命令!
先来看看官方帮助文档的介绍:
hold on: 保留当前坐标区中的绘图,从而使新添加到坐标区中的绘图不会删除现有绘图。如果不存在坐标区,hold命令会创建坐标区。
从上面解释中我们可以得到下方信息:
•hold on针对的是一个坐标区(中的绘图);
•如果不加指明,指的就是当前坐标区;
•如果没有任何坐标区,hold on命令会新建一个坐标区。
听着有一些复杂,但是其实也很好理解,建议阅读一下图图前期的文章{戳这里是超链接}——关于一个figure窗口中所有对象的层次结构,并且牢牢记住当前图窗、当前坐标轴、当前对象这三个概念。有了上述三个概念,并且在每次绘图之前思考我的当前坐标轴是什么,就不会搞错了。
我们还是从简单的绘图看起,首先创建一些初始数据
接着我们绘制第一张图,此时hod on被注释掉了,我们发现应该出现两条线的图窗上仅出现了一条线。

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

以上的内容相信大家以前都已经非常熟悉,下面我们看看如果有多个子图怎么办。
首先创建一些子图,其中返回值ax1,ax2,ax3是对应子图的句柄(指针)。
分别用和不用hold on命令来在这些图窗上绘制图,看看会有什么结果:
大家发现只有ax2对应的坐标区仅有一条线,而其他两个坐标区都有两条线,这就是hold on在起作用~


三、复杂形式的数据图绘制案例
本推送属于绘图系列教程中非常重要的一环:介绍一组稍复杂的MATLAB绘图命令。
实现的示例图(demo)如下所示:

该图中结合了柱状图,折线图和散点图。其中:
柱状图有渐变颜色的填充;
折线图与柱状图分属两个不同的平面;
散点图的Edge具有不同的颜色设置;
含有观察视角的设置方式;
下面分块介绍代码:
A
f.Color='w';代表将图窗的颜色设置成了白色。

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

C
绘图后的数值控制。
D
E
坐标轴视角控制View属性。
完整代码
完整的教程请关注公众号:图通道