matlab legend_Matlab绘图的各项命令与技巧

6c76a0b0e32a813375ab25d4d66cab4b.png

matlab是一个特别强大的数学工具,可以做简单的编程分析,又有各种工具箱比如人工神经网络、深度学习等。较多理工科的研究生都会使用matlab来处理分析数据,然后直接出图。在这里,我结合自身的经验,总结读研3年来应用matlab绘图发现的各种技巧,让你可以一键就能生成学术标准、美观的图形。

说明:以下代码均可在matlab2020的版本上运行,如果出错,可能是版本之间的相同属性有些许差别

  1. 图形中必要的赋值与必要的绘图数据准备

在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
双坐标轴

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
虚线网格线

8. 绘制阴影

78c4b0beab314ca18dc095fb35a9a282.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
用subplot画出来的图形画布空白多
s1 = subplot(1,2,1,'Position',[])
s2 = subplot(1,2,2,'Position',[])

然而,在实际应用中,subplot还存在着不足,比如当子图过多时,就算调整好各图的'Position',用subplot函数不能将所有子图完整显示出来。那么就可以自己自定义坐标系axes(自从用了axes以后,再也没用过subplot)。同样的,也是控制坐标系的'Position'属性,想在画布上怎么放坐标系就怎么放。

c77a480ad2ab244762d978f08a7b95ee.png
直接定义每幅图的axes的位置,可以充分利用画布空间
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
无规律的生成多线条

2afda6fdcf740a2684e57586c42e38c2.png
将每条线按照设定的颜色渐变顺序绘制出来

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绘图时得到的一些经验,有什么遗漏的或不是那么准确的欢迎大家指正,希望大家能多多包含。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值