![6c76a0b0e32a813375ab25d4d66cab4b.png](https://i-blog.csdnimg.cn/blog_migrate/584336bbbcb2875c2f8f8cf1ae2ce765.jpeg)
matlab是一个特别强大的数学工具,可以做简单的编程分析,又有各种工具箱比如人工神经网络、深度学习等。较多理工科的研究生都会使用matlab来处理分析数据,然后直接出图。在这里,我结合自身的经验,总结读研3年来应用matlab绘图发现的各种技巧,让你可以一键就能生成学术标准、美观的图形。
说明:以下代码均可在matlab2020的版本上运行,如果出错,可能是版本之间的相同属性有些许差别
- 图形中必要的赋值与必要的绘图数据准备
在matlab绘图时,不需要将图窗赋值给变量也能生成图形,例如生成一个图窗就是figure,绘制直线就直接plot(x,y)。但是如果想要完全用代码来控制成图,那么将这些图形赋值给变量会使后面的操作十分便利。比如,我在绘制一个多子图的图形时,会先生成一个figure:
f1
那么,接下来我就可以以这个f1为画布,将子图一一放上去:
a1
同样的,我也将各个子图的坐标系赋值给了变量,这也是方便后面对各个坐标系进行特定的设置。(在这里,个人比较习惯使用axes来生成子图,应用subplot的道理也是一样的)
除了图窗或坐标轴,我会将绘制的线条或者色块也进行赋值,比如:
p1
这样当你的图里出现多种线条或者元素时,可以通过这个变量控制图例显示的顺序或者是否显示。例如;
l1=legend([ar1,p1],'第一个图例','第二个图例')
这样在绘图的时候不需要特别设定顺序,也可以按照所需要的顺序在图例中显示出来。而且这里给图例赋值,在设置图例的字体、位置、摆放方式时也特别便捷。总之,在绘图伊始,对图窗、坐标轴与图线赋值对后面利用代码控制图形具有较大的便利。
2. title, xlabel内容中的文字特殊形式
生成了大概的图形后,需要对图形增加标题,图例,必要的文本标注等元素。这些元素里面的内容有时候是纯文字,有时候是公式,会存在较特殊的格式,比如上下标,斜体,特殊符号。以下是我遇到的情况示例:
3. legend的位置设定、摆放形式
legend是图形必不可少的元素,根据不同图形的内容,它的放置形式也要得到调整。一般情况下,都是生成图形后,看看legend的位置有没有遮挡住图中的线条与元素,如果有的话,可以直接在图窗上拖动legend到最合适的位置,再保存图形即可。
但当你需要生成很多图时,这样操作就不便利了。通常情况下,legend的位置属性('location')的默认值时'best',它还有别的选项:south, north, southeast 等(见help文档)。如果location的设置仍无法满足要求,还会挡住图形,也可以通过'Position'属性,直接定义它在当前画布上(f1)的位置,该属性的输入是[left, bottom, width, height],与matlab中所有具有'Position'属性的输入是一致的。通过自定义位置,可以让legend放在任何一个你想放置的地方。
如果无论怎么调legend,还是会挡住线条,或者还是不够清晰美观,那么可以换一种摆放形式。默认情况下,legend多个图例是按行排列的,就是垂直排列。通过设置 'Orientation'属性,可以调成水平排列。上述两个设置的代码如下:
set(l1,'Location','southeast','Orientation','horizontal')
% l1是前文代表legend的变量;这里设置的意思是legend放置在图形的东南处,图例水平向排列
4. 坐标轴的日期间隔
时间序列图是做基础学科用到的较多的图形。我们绘制时间序列图时,会先将时间转换成时间数字作为x轴,再调用datetick('x')命令,生成带有如(日/月)格式标签的x轴。如果需要显示特定的时间间隔,可以使用以下代码:
dd
时间间隔可以按需修改,这样就能生成所需的坐标刻度与刻度标签了。
5. 生成双坐标轴的图形
双坐标轴是科研中比较常规的图形了。生成双坐标轴图形通常有两种方法。一种是plotyy(x1,y1,x2,y2)。这种能满足较基本绘制线条的需求,但存在较大的局限性。我比较习惯使用分别定义左右坐标轴的做法:
yyaxis left % 左边的坐标轴
p1 = plot(x1,y1) % 绘制直线图
set(a1,'Ycolor',[0 0 0])% 设置黑色的y轴
yyaxis right % 右边坐标轴
b1 = bar(x1,y2) %绘制柱状图
set(a1,'Ycolor',[1 0 0])% 设置红色的y轴
这种方法的好处是1)可以自定义左右坐标轴在同一张图上绘制不同类型的图,如例子中左边的坐标轴绘制了直线图,右边的坐标轴绘制了柱状图;2)可以对每个坐标轴直接进行属性(坐标颜色、坐标标签字体大小等)设置,例如将左边的纵坐标轴设置成红色,右边的纵坐标轴设置成黑色。
![56f393a3099a15cc37effe40f372d47c.png](https://i-blog.csdnimg.cn/blog_migrate/cfa80c54d1a6d6125c9ff4752e4fec10.png)
6. 生成带有位于任意位置子图的图形
科研绘图中,有时候需要在一张画布上绘制两个坐标系,操作很简单,总的来说就是在一张画布(f1)上将两个坐标系按需求放置在固定的位置。主要应用到的就是坐标系 axes 的 'Position' 属性。
f1 = figure;
a1 = axes('Parent',f1,'Position',[])
plot(x1,y1)
a2 = axes('Parent',f1,'Postion',[])
h1 = hist(error)
7. 设置图形中网格的格式
为了能更直观的凸显出图形中的数字特征,可以为图形加上网格线。无需特殊设置时,直接在绘图语句下面再加
grid on
即可;当对网格线有特殊要求(虚实线、颜色、粗细)时,可以这样设置:
set(a1,'GridAlpha',0.3,'GridLineStyle','--','GridColor','k') % 设置a1坐标系的网格线
网格更多的输入属性可查help文档。
![208f542060c35684695cbe756b8a432e.png](https://i-blog.csdnimg.cn/blog_migrate/82af9f7306cdfc045f57f9c1a3738a99.png)
8. 绘制阴影
![78c4b0beab314ca18dc095fb35a9a282.png](https://i-blog.csdnimg.cn/blog_migrate/e93aba89b7eae10accf8bbc3aba4b5d9.png)
利用阴影可以突出图形中的特定部分或区别各个部分,见上图。绘制阴影可以使用patch(x,y,c) 函数或area(x,y)函数。
area(x,y,'FaceColor',[0.9 0.9 0.9 0.9],'EdgeColor',[0.9 0.9 0.9 0.9],'LineStyle','none','BaseValue',0.138)
% 'FaceColor'是填充颜色,'EdgeColor'是填充的边缘颜色,'BaseValue'是填充的基线
9. 生成紧凑的多子图图形
说到生成多子图的图形,第一反应是使用subplot(行数,列数,图号),但matlab默认排列的子图间隔比较宽,使得子图小,整张画布的空白大。那么就需要人为控制各个子图的位置。同样的,本节的关键还是应用'Position'属性,通过自定义每个子图的位置与大小,即可生成符合个人需求的多子图图形。
![5fa487a2a3e164ccf4d5997c5a293251.png](https://i-blog.csdnimg.cn/blog_migrate/3130fee4fc9eb14945d6ea3c18a75c72.jpeg)
s1 = subplot(1,2,1,'Position',[])
s2 = subplot(1,2,2,'Position',[])
然而,在实际应用中,subplot还存在着不足,比如当子图过多时,就算调整好各图的'Position',用subplot函数不能将所有子图完整显示出来。那么就可以自己自定义坐标系axes(自从用了axes以后,再也没用过subplot)。同样的,也是控制坐标系的'Position'属性,想在画布上怎么放坐标系就怎么放。
![c77a480ad2ab244762d978f08a7b95ee.png](https://i-blog.csdnimg.cn/blog_migrate/e8ab9e905d63e02f4de2a3e8e18883bb.jpeg)
a1 = axes('Parent',f1,'Position',[])
a2 = axes('Parent',f1,'Position',[])
10. 生成渐变颜色的多线条图
当一张图上线条太多,且每条线是遵循一定的规律(如时间序列),可以将线条的颜色按照指定的渐变规律画出,代码如下:
c(1:34,:) = colormap(jet(34)); % 生成以jet色条为基础的颜色参数序列
f1 = figure;
for i = 1:34
p(i) = plot(x1,y1(i,:),'Color',c(i,:))
hold on
end
colorbar('Location','eastoutside','Xtick',[0 1],'TickLabels',{'T_{0}','T_{t}'}) % 显示colorbar表示颜色渐变的含义
![a2a7fe72bed069d3a69f399f5fcad400.png](https://i-blog.csdnimg.cn/blog_migrate/1dd66303b7664d7a87b17d09f9bd9d0c.jpeg)
![2afda6fdcf740a2684e57586c42e38c2.png](https://i-blog.csdnimg.cn/blog_migrate/22506a3fe09d694b7cfdf16135fd0c57.jpeg)
11. 保存成PDF格式
一般投稿英文文章需要的图形是PDF格式,如果直接在图窗的另存为生成pdf格式的文件,太宽或者太长的图不能全部显示在PDF默认的A4版面上,那么可以使用代码控制生成PDF图形的大小。
f1 = figure % 该命令的执行须在图窗命令下
set(gcf,'PaperPosition',[0.1 0.2 16 16]) % 设置图形在PDF的位置,与前文的 'Position'属性代表的含义一样
set(gcf,'PaperSize',[16 16]) % 设置PDF纸张的大小:[宽度 高度]
saveas(gcf,'fig_pdf.pdf') % 保存命令,在当前目录下生成名为fig_pdf的PDF文件
一些tips
1) 当你实在不知道代码要怎么调时,直接在生成的fig图窗里编辑,然后右键编辑处,选择生成代码,就能知道这里编辑的代码应该怎样写了。
2) 作图时,除了另存为.emf, .jpg等图片格式,最好也保存一份.fig,如果后续还需要进行一些细节的修改,可以直接在.fig上操作,再重新另存成图片格式。这样就不用再运行一遍程序或在代码行里修改。
以上纯属我个人使用matlab绘图时得到的一些经验,有什么遗漏的或不是那么准确的欢迎大家指正,希望大家能多多包含。