首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MATLAB作图从入门到熟练

有同学说,靠网络上的文章,很难学到系统的知识,还得自己看书,这话不假。主要是因为网上文章篇幅过短,难免无法概括全面,加之同学们更关心一些高效的学习方法,更倾向于接受高密集信息的学习方式,节省时间和精力。

本期推文,喵姐会介绍一下matlab作图,尽量让各位同学通过一篇推文学会matlab作图从入门到熟练。

如果你对matlab已经有所了解,可以跳过下面的入门部分。

思想部分

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

入门部分

基础部分

首先输入figure打开图像界面。

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

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

输入代码x=linspace(1,10,100); 这样你会得到1到10的100个平均分布离散点,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生成-2到2,每行隔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可以换成left。HorizontalAllignment表示水平放置,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])

holdon

xy=[];

n=0;

but=1;

whilebut ==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');

holdoff

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

喵呜~

好的,上面我们学会了如何去用鼠标画图喵姐不知道学会这个能有什么用,下面喵姐介绍一下如何“打光”。

虽然说在figure的工具栏区域就可以调整颜色,但喵姐的方法显然更“高级”一些。

喵姐说“要有3D图”,于是就有了这个:

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

shading interp

接下来邀请灯光师——light和lightangle,你可以输入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三题,高校推送国奖数量调整

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190905A0FA2000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券