Datahub
数据改变生活

MATLAB作图从入门到熟练

发表时间:2022-07-14 14:21


喵姐 求知联盟 2019-12-05 10:29
有同学说,靠网络上的文章,很难学到系统的知识,还得自己看书,这话不假。主要是因为网上文章篇幅过短,难免无法概括全面,加之同学们更关心一些高效的学习方法,更倾向于接受高密集信息的学习方式,节省时间和精力。
本期推文,喵姐会介绍一下matlab作图,尽量让各位同学通过一篇推文学会matlab作图从入门到熟练。
如果你对matlab已经有所了解,可以跳过下面的入门部分。


图片
思想部分
为什么我们要用MATLAB作图,而不是用python作图?这个是工具选择问题,人与人之间各有偏好。那么作图的目的是什么?是为了清晰地表达数据结果。在数学建模竞赛这方面,数据结果表达与论文排版的好坏对论文得分的影响往往很大。由此,很有必要了解如何正确科研作图。

入门部分
(新手向matlab作图)

基础部分
首先输入figure打开图像界面。

图片

在figure palatte处你可以通过鼠标点击来决定生成多少个图像。

图片

注意变量区域,现在什么变量都还没有。

图片

输入代码x=linspace(1,10,100); 这样你会得到110100个平均分布离散点,1×100的矩阵储存于x中。

图片

图片

双击workspace中的x进去,你会发现x各个行列具体的值。

图片

让我们回到figure,左侧Variable窗口出现了x,注意右侧Plot Browser,在这里选中坐标系就是让函数图显示,取消勾选就会消失。点击底下的Add Data...Plot Type内有很多不同类型的作图方式,我们先以plot为例,随便输入一个y的表达式吧。

图片

这样1-10区间的函数图便被插入到了图中,在底侧你还可以随时更改具体参数。有时你可能需要添加一条参照线,就可以使用这种方法。

图片

而选择Plot Type,你可以换成其他类型的图。

图片

如果我再次Add Data,并且设置为线形,它们都会共存于同一图像中。

图片




当你想要绘制3D图时,不要忘了
[x,y] = meshgrid([-2:.2:2]);
这会让x和y生成-22,每行隔0.2取一个值的一个二维矩阵。
让我随便输入一个z=x^2*2./y;
回到Variables窗口,按住ctrl键,选中xyz,右键,选择Plot Catalog...

图片

再选中3-D Surfaces,这么多种3D图,总有一个适合你。

图片

在生成结果的界面,可以点击旋转按钮,得到不同视角的视图。
同时,在你生成后,回到代码窗口,你会发现多了一行生成图像的代码,同学们可以保存下来过程代码,存为m文件,毕竟数模竞赛论文末尾需要附录代码。

图片

点击Data Cursor按钮,再点击图像中的线条,便可以得到该点的坐标数据,你还可以点住不放标记物,移动标记点或文本框的位置。

图片

正常而言,你对图片的很多描述都在figure中操作,一旦关闭,事后则需要重新来说。所以我们可以通过点击Generate Code...按钮,来生成m文件保存图像的描述。

当你需要多个标记点时,你可以右键点击图像,选择Create New Datatip,再次插入一个标记点。

图片

图片

尽管生成了代码,大家仍需要注意此时代码还没有输入xyz值。
菜单栏上还有Insert Colorbar按钮,插入一个直观的色彩板。

图片





让我们回到2D图,有时你可能需要放大某个需要特别关注的区域。那么你应该选择放大镜Zoom In按钮,再于图像中间按住不放,框选理想的区域。这样会重新生成一个坐标轴。

图片

图片

若想恢复,则可以右键图像,选择reset to Original View。

图片

你也可以生成一列的两幅图,方便对比。
而假若当你一幅坐标系上多个函数图线,喵姐建议使用不同颜色以及不同线型(虚线什么的)来区分,这样看起来会很清晰。

图片


有时我们在鼠标拖动函数图像时,会产生不对齐的现象,此时可以点击Tools中的Snap To Layout Grid按钮,这样拖动时,会有网格对齐。
有些同学可能在意,在局部放大图的x轴中,鼠标框选可能选不中整数原点,就会心里很难受。这种情况,应该用subplot函数,并且axis([xmin xmax ymin ymax])规定好显示范围。
在matlab中生成的函数中,xy轴的尺度不是相同的,这样可能产生一些扭曲的不符合直觉的图形,如果想要设定为xy尺度相同,则需要输入:
axis equal




让我们继续。
假如说,我们有一些离散的数据如下。

x=[0 1 2 3 4 5 6 7 8 9];

y=[0 0.2 0.9 1.5 1.8 2.8 3.4 5.8 6.9 8.1];

plot(x,y)

图片

它看起来平平无奇。
不过我们可以点击Tools中的Basic Fitting

图片

在这里,你能选择很多,比如图示选择了线性,并且勾选了Show equations,这样拟合出来直线后,会在图上显示y=ax+b这样的函数。

图片

有时你可能不想要线性拟合,这里有这么多分类,总有一款符合你的胃口。

图片

与此同时你还可以subplot拟合之后,查看新图像与原图像的数值偏差。

图片

下面介绍工具栏中的Data Statistics。

图片

点开后,仍然是平平无奇。

图片

在这里勾选对应xy轴的数值,便会在函数图中生成对应的参考线。

图片

如果需要在图上进行其他标注,则可以利用Annotations内的各种按钮,正常来说,用好文本框和箭头就足够了。

图片

那么问题来了,假若你想特殊标记某个点,以文本框的形式,并且要求非常精确,这样你最好使用代码实现。
text(x点坐标,y点坐标,\leftarrow你想说的话,HorizontalAlignment,right,FontSize,16)

其中左箭头leftarrow可以换成右箭头rightarrow,位置右侧right可以换成leftHorizontalAllignment表示水平放置,FontSize表示字体大小。

有时也会需要\leftarrow,\rightarrow\bullet这些符号。

下面为例:

text(0.1,0.2,'我是加点\rightarrow\bullet','HorizontalAlignment','right','FontSize',12)

图片


一般而言,我们需要标记最大值或者最小值,那么我们则需要找到函数的最大值和最小值。
比如说我们有如下函数图。

x=[0 1 2 3 4 5 6 7 8 9];

y=[16 8 5 2.2 7 12 16 11 15 13];

>> plot(x,y)

图片

输入

Imin=find(min(y)==y);

图片

返回的值为4,则说明y(4)y中的最小值。当然你也可以输入imax=find(max(y)==y);来找到最大值。
此后用text(x(imin),y(imin))这样语句来标记该点就好了。
text(x(imin),y(imin),'\leftarrow这里是最小值2.2')

图片



在曾经的推文中,喵姐推送过一次关于mathpix的推荐,mathpix不仅可以识别标准打印的公式,也可以识别手写的公式,导出的公式代码同样,不仅用于latex,也可直接粘贴于mathtype生成可编辑代码。


下面,你可能需要学会一些代码,借此修饰你的函数图,使其更为美观或者自定义化。

输入grid on;,你会得到网格。

图片


选中函数图线,当你设置line为none,则线会消失,而这时设置Marker标记一下散点,你就会得到散点图。

图片

图片

你若是再设置Plot Type为Stem,就会看起来挺好玩的样子。

图片

萌新刚刚入门matlab作图时,大概最常见的问题就是没有注意点乘和向量对齐,不过呢,当x,y其中一个为矩阵,另一个为向量,仍然可以生成图像。

比如说plot(y,x)。其中x=linspace(1,49,50);y=peaks;

图片




有时我们可能需要地形图。

图片

在matlabhelp信息中,发现可以用quiver语句来用小箭头表示坡度。

>> n=-4:0.2:4;

>> [x,y,z]=peaks(n);

>> contour(x,y,z,10)

>> [u,v]=gradient(z,.2);

>> hold on

>> quiver(x,y,u,v)

图片

除此以外,你还可以输入:
contour(x,y,z,'ShowText','on')
得到下图,更为直观。

图片

好了,让我们进入到下一部分。


玄学部分

在这里,喵姐会传授你如何实现传说中的“美术建模”。


axis([0 10 0 10])

hold on

xy=[];

n=0;

but=1;

while but ==1

 [xi,yi,but]=ginput(1); %在函数图上左键点击将xy传给xi,yi

 plot(xi,yi,'ro')

 n=n+1;

 xy(:,n)=[xi;yi];

end

t=1:n;

ts=1:0.1:n;

xys=spline(t,xy,ts);

plot(xys(1,:),xys(2,:),'b');

hold off

保存以上代码为m文件,然后运行后,会出现matlab画布,左键点击会以圆圈为标记作一个点,右键选定最后一个点,然后用spline函数插值形成函数图。

图片

喵呜~

好的,上面我们学会了如何去用鼠标画图喵姐不知道学会这个能有什么用,下面喵姐介绍一下如何“打光”。
虽然说在figure的工具栏区域就可以调整颜色,但喵姐的方法显然更“高级”一些。
喵姐说“要有3D图”,于是就有了这个:

图片

我们可以输入下面这行两个单词的代码先把它皮剥了。

shading interp

图片

接下来邀请灯光师——lightlightangle,你可以输入lightangle(-45,30),或者light('position',[0,0,5]),借此加入光源。

图片

讲道理,光线有点刺眼。
输入以下两行代码,这样得到的光线则会柔和很多。

set(gcf,'Renderer','zbuffer')

set(findobj(gca,'type','surface'),'FaceLighting','phong','AmbientStrength',.6,'DiffuseStrength',.9, 'SpecularStrength',.5,'SpecularExponent',40,'BackFaceLighting','unlit')

图片

在这里,FaceLighting有三种选项,分别为“flat、gouraud和phong”,从左至右表面加光效果越来越精细。
AmbientStrength越高氛围越来越浓。DiffuseStrength越高颜色分布浓度。
SpecularStrength越高则反光光泽越明显。SpecularExponent越小光泽越大。
BackFaceLighting值为reverselit或者unlit,reverselit则会照明背面。

怎么样,图是不是更好看了些呢?

图片

到此,我想你已经具备了足够的matlab作图知识,
但在比赛时,还是经常会有需要“现学现做”的情况出现。
总之,一直保持学习就对了呀~

图片
19年国赛新变化,本科将有ABC三题,高校推送国奖数量调整
19年国赛避免违规指南

公众号数学建模教程往期内容汇总/20190721
数学建模竞赛所涉及的全部资料(MATLAB入门和软件+各种模型+算法原理+源代码+指导用书+写作指南+MCM/ICM模板)


涵盖大学的各个方面,数模入门到轻松拿奖

萌新如何成长成为学霸,升学是保研还是出国

英语该怎么学,其他竞赛怎么办,资料该怎么找...

图片




QQ:258506508                                     联系电话:020-000000    000-000000                                   联系邮箱:xxx@.co.m                                     联系地址:XXX省XXX市XXX县XXX路