有同学说,靠网络上的文章,很难学到系统的知识,还得自己看书,这话不假。主要是因为网上文章篇幅过短,难免无法概括全面,加之同学们更关心一些高效的学习方法,更倾向于接受高密集信息的学习方式,节省时间和精力。
本期推文,喵姐会介绍一下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三题,高校推送国奖数量调整
领取专属 10元无门槛券
私享最新 技术干货