Matlab绘图基础
平台:Win7 64 bit,Matlab R2014a(8.3)
Matlab绘图功能强⼤,本⽂以“图解Matlab绘图”的形式介绍Matlab绘图的常⽤元素。
1.以图识图
在Matlab中新建⼀个矩阵,在左侧⼯作区窗⼝中选中这个变量,点击菜单“绘图”,即可以查看Matlab的各种图形:
点击“显⽰更多”⼩箭头:
点击左下⾓“⽬录”按钮:
从这⾥可以看到所有Matlab的图形。另外,从Matlab R2014a帮助⽂档的“Types of MATLAB Plots”(搜索即可)中也可以看到Matlab⽀持的所有图形。我的另⼀篇博⽂也总结了Matlab的所有绘图函数——。
这⾥想说的是,数据可视化的⽬的本来就是让⼈易于理解数据,学习Matlab绘图也是这样,应该以⼀种直观的、图形的、易于理解的⽅式进⾏(本⽂努⼒做到这点)。其实,如果只是要⽤Matlab绘图,并⾮要
系统掌握Matlab绘图相关语法,只需要了解各个绘图函数的输⼊数据格式,其他的如坐标轴控制、注解、颜⾊图等都可以通过在窗⼝中进⾏图形界⾯上的操作进⾏,毕竟,没有必要把时间浪费在记忆⼤量的语法上。
2.输⼊数据格式
Matlab⾯向数学处理,输⼊数据格式也是数学风格的,⽐如对于平⾯上的点集(点数组),Matlab⽤两个⼀维数组来表⽰:x,y,这样第i个点的坐标就是(x(i),y(i))。这对于程序员来说可能有些不适应,因为⾯向对象程序设计思想要求封装性,也就是要将⼀个点的x,y坐标放在⼀起构成Class“点”,然后⽤“点”这个类型来声明数组。所以在使⽤Matlab绘图功能时最好尽量⽤数学的思维⽅式,⽽不是编程思维。
要查看绘图函数的调⽤格式,请⽤“help xxx”指令,下⾯是⼀个例⼦:
在说具体数据格式之前,先要说⼀下“采样”和“插值”。这⾥说的Matlab绘图,很多是要绘制连续函数的图像,计算机存储空间有限,连续(⽆限)的定义域要被“采样”或者说“离散化”之后才能处理,⽽在绘制时,为了显⽰连续的的曲线或曲⾯,⽽不是仅仅绘制⼀系列点,需要进⾏“插值”,最常见的插值就是线性插值。其实,“采样”和“插值”的概念在计算机科学中有⼴泛的存在。
下⾯以最常见的⼏个绘图函数为例,介绍Matlab绘图函数的输⼊数据格式:
Function Syntax描述
plot plot(X,Y)
plot(X,Y,LineSpec)
plot(X1,Y1,...,Xn,Yn)
plot(X1,Y1,LineSpec1,...,Xn,Yn,LineSpecn)
plot(Y)
plot(Y,LineSpec)
plot(___,Name,Value)
plot(axes_handle,___)
h = plot(___)若X,Y均为向量,则点(X(i),Y(i))作为第i个被绘制的点,根据格式控制的不同,相邻点间可能被插值(连⼀条直线段);
若X,Y为尺⼨相同的矩阵,X(:,i),Y(:,i)被绘制为⼀条曲线,默认不同曲线将有不同颜⾊;
若X被省略,则相当于X=1:n,n为点数。
bar bar(Y)
bar(x,Y)
bar(___,width)
bar(___,style)在x(i)处绘制⼀组(grouped)或⼀条堆叠(stacked)的条形,条形⾼度由Y(i,:)指定;
若x被省略,则相当于x=1:n,n为Y的⾏数。
bar(___,bar_color) bar(___,Name,Value) bar(axes_handle,___) h = bar(___)
scatter scatter(X,Y)
scatter(X,Y,S)
scatter(X,Y,S,C)
scatter(___,'fill')
scatter(___,markertype)
scatter(___,Name,Value)
scatter(axes_handle,___)
h = scatter(___)对每个点(X(i),Y(i)),绘制⼀个圆圈;
若S是向量,圆圈⼤⼩由S(i)指定,若S是标量,由S指定;
若C是向量,圆圈的颜⾊由C(i)对应的颜⾊组成,若C是矩阵,由C(i,1:3)指定RGB 颜⾊值。
contour contour(X,Y,Z)
contour(Z)
contour(…,n)
contour( (v)
contour(...,LineSpec)
contour(axes_handle,...)
[C,h] = contour(...)Z为MxN的⼆维数组,若X,Y也是MxN⼆维数组,则Z(i,j)=F(X(i,j),Y(i,j)),若X,Y是向量,则Z(i,j)=F(X(j),Y(i))(即把X,Y看做列向量),F为⼆维函数;
若X,Y被省略,则相当于X=1:N,Y=1:M;
标量n设定等值线条数;
单调递增向量v设定等值线的值。
surf surf(X,Y,Z)
surf(Z)
surf(…,C)
surf(...,'PropertyName',PropertyValue)
surf(axes_handles,...)
h = surf(...)Z为MxN的⼆维数组,若X,Y也是MxN⼆维数组,则Z(i,j)=F(X(i,j),Y(i,j)),若X,Y是向量,则Z(i,j)=F(X(j),Y(i))(即把X,Y看做列向量),F为⼆维函数;
若X,Y被省略,则相当于X=1:N,Y=1:M;
C(i,j)的值对应到曲⾯上i,j点的颜⾊。
mesh mesh(X,Y,Z)
mesh(Z)
mesh(...,C)
mesh(...,'PropertyName',PropertyValue,...)
mesh(axes_handles,...)X,Y,Z,C的含义同surf。
注:对于向量x,y,可以
⽤“[X,Y]=meshgrid(x,y)”构造⼆维数组X,Y,使得mesh(x,y,Z)和mesh(X,Y,Z)等价,也即有MxN个采样点,(X(i,j),Y(i,j))是索引为i,j的格点的x,y坐标。
slice V为MxNxP的三维数组,若X,Y也是
MxNxPs三维数组,则
字符串转数组matlabV(i,j,k)=F(X(i,j,k,Y(i,j,k),Z(i,j,k)),若X,Y,Z
是向量,则V(i,j,k)=F(X(j),Y(i),Z(k)) ,F为
三维函数;
若X,Y,Z被省略,则相当于
X=1:N,Y=1:M,Z=1:P;
向量sx,sy,sz指定垂直于x,y,z轴的切⽚位
置;
矩阵XI,YI,ZI定义更复杂的切⽚(可能不是
平⾯)。
coneplot X,Y,Z,U,V,W都是MxNxP的三维数
组,U(i,j,k)=Fu(X(i,j,k),Y(i,j,k),Z(i,j,k)),Fu
为三维向量函数F的x分量,类似定义
Fv,Fw;
Fv,Fw;
若X,Y,Z被省略,则相当于
[X,Y,Z]=meshgrid(1:N,1:M,1:P);
Cx,Cy,Cz定义圆锥起点的x,y,z坐标;
s定义缩放因⼦;
color指定圆锥颜⾊;
'quiver'指定⽤箭头代替圆锥;
'method'在Cx,Cy,Cz指定点上的插值⽅
法。
3.格式控制及注解
前⾯也说了,如果仅是要绘图,通过窗⼝操作这种“所见即所得”的⽅式不但可以快速⽣成美观的图形,⽽且节省⼤量时间,下⾯就⾸先来看看在Matlab的图形窗⼝如何进⾏图形格式控制。下⾯是Matlab的图形窗⼝:
Z=peaks;
surf(Z);
上图中已经可以对图形进⾏缩放、平移、旋转、拾取数据、刷亮、图形链接、插⼊颜⾊栏、插⼊图例等功能,通过在菜单中选择还可以添加光照、坐标轴标签等,点击上图中的红⾊箭头所指按钮后将显⽰更多绘图⼯具栏:
可以看到这已经是⼀个⾮常强⼤的编辑界⾯了,点击上图右下⾓按钮“更多属性…”,将看到:
这⾥可以进⾏更为全⾯的控制,很容易猜到,这⾥的项和指令代码有很好的对应。通过⼀番调整,且没有写任何代码,我的图已经变成如下样⼦(峰值数据是通过拾取⼯具得到的):
如果觉得格式调整的好,还可以将所有的设置和调整“打包”成代码,在图形窗⼝中点击菜单“⽂件 >> ⽣成代码…”即⽣成⼀个M函数⽂件,以后调⽤这个函数对新数据进⾏绘图时,所有设置便⾃动应⽤到新数据上,也可以查看⽣成的代码来学习绘图相关语法。这种以“从图形到代码”的⽅式和传统“从代码到图形”的⽅式相⽐效率定会⾼出很多。
Matlab绘图格式控制的详细说明参考Matlab帮助⽂档“Matlab/Graphics/Formatting and Annotation”,下⾯仅对最为常⽤的指令进⾏介绍:
坐标系:
指令说明
axis on/off打开/关闭坐标轴显⽰
Axis(V)
设定坐标范围
V=[x1,x2,y1,y2]或
[x1,x2,y1,y2,z1,z2]
axis equal x,y坐标采⽤等长刻度
axis vis3d三维旋转观察时保持⾼宽⽐不变,避免图形⼤⼩变化
grid on/off打开/关闭分格线
xlabel(S)/ylabel(S)/zlabel(S)设定x/y/z轴标签为S
注解:
指令说明
title(S)设定图的标题
legend(S1,S2,…)加⼊图例
text(xt,yt,S)在(xt,yt)处书写注释S
关于字符串显⽰的格式及转移符号参考Matlab帮助⽂档“Text Properties”。
重叠绘图:
指令“hold on/off”控制是重叠绘制还是覆盖已有图形。
多⼦图:
指令“subplot(m,n,p)”将绘图区分为mxn个区域,并指定以⾏优先的第p个⼦区为当前绘制区,例如下(取⾃Matlab帮助⽂档):
x = linspace(0,10);
y1 = sin(x);
y2 = sin(2*x);
y3 = sin(4*x);
y4 = sin(8*x);
figure
subplot(2,2,1);
plot(x,y1);
title('Subplot 1: sin(x)')
subplot(2,2,2);
plot(x,y2);
title('Subplot 2: sin(2x)')
subplot(2,2,3)
plot(x,y3);
title('Subplot 3: sin(4x)')
subplot(2,2,4)
plot(x,y4);
title('Subplot 4: sin(8x)')
Colormap, Shading, Light:
为了直观呈现数据,花哨的颜⾊是少不了的,除了直接指定所绘制对象的颜⾊外,颜⾊可以由标量数据映射到颜⾊表得到,从⽽得以利⽤颜⾊来呈现第四维度的信息。这⾥⼜涉及“采样”和“插值”,⼀个Colormap定义⼀个颜⾊表,这是采样后的有限个颜⾊值,待映射函数值f⾸先根据Cmax和Cmin算出⼀个1-N的数c,N是颜⾊表颜⾊值的个数,对c进⾏上下取整作为索引得到两个颜⾊值,再根据c和这两个颜⾊值插值得到f映射的颜⾊,f映射的颜⾊只是⼀个格点的颜⾊,由四个格点围成的⼩四边形的颜⾊由这四个格点插值得到,shading和light指令就是⽤来控制映射的颜⾊值如何影响显⽰颜⾊的。
参考Matlab帮助⽂档“Matlab/Graphics/Formatting and Annotation”。
参考⽂献:
博客:;
《MATLAB R2011a教程》(张志涌等,北京航空航天⼤学出版社,2011),第5章;
Matlab R2014a帮助⽂档,“MATLAB/Graphics”()。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论