第7章 绘图与图形处理
人们很难从一大堆原始的数据中发现它们的含义,而数据图形恰能使视觉感官直接感受到数据的许多内在本质,发现数据的内在联系。MATLAB可以表达出数据的二维,三维,甚至四维的图形。通过图形的线型,立面,色彩,光线,视角等属性的控制,可把数据的内在特征表现得淋漓尽致。下面我们分别介绍图形的命令。
7.1 二维图形
7.1.1 基本平面图形命令
命令1 plot
功能 线性二维图。在线条多于一条时,若用户没有指定使用颜色,则plot循环使用由当前坐标轴颜色顺序属性(current axes ColorOrder property)定义的颜色,以区别不同的线条。在用完上述属性值后,plot又循环使用由坐标轴线型顺序属性(axes LineStyleOrder property)定义的线型,以区别不同的线条。
用法 plot(X,Y) 当X,Y均为实数向量,且为同维向量(可以不是同型向量),X=[x(i)],Y=[y(i)],则plot(X,Y)先描出点(x(i),y(i)),然后用直线依次相连;若X,Y为复数向量,则不考虑虚数部分。若X,Y均为同维同型实数矩阵,X = [X(i)],Y = [Y(i)],其中X(i),Y(i)为列向量,则plot(X,Y)依次画出plot(X(i),Y(i)),矩阵有几列就有几条线;若X,Y中一个为向量,另一个为矩阵,且向量的维数等于矩阵的行数或者列数,则矩阵按向量的方向分解成几个向量,再与向量配对分别画出,矩阵可分解成几个向量就有几条线;在上述的几种使用形式中,若有复数出现,则复数的虚数部分将不被考虑。
plot(Y) 若Y为实数向量,Y的维数为m,则plot(Y)等价于plot(X,Y),其中x=1:m;若y为实数矩阵,则把y按列的方向分解成几个列向量,而y 的行数为n,则plot(Y)等价于plot(X,Y)其中x=[1;2;…;n];在上述的几种使用形式中,若有复数出现,则复数的虚数部分将不被考虑。
plot(X1,Y1,X2,Y2,…),其中Xi与Yi成对出现,plot(X1,Y1,X2,Y2,…)将分别按顺序取两数据Xi与Yi进行画图。若其中仅仅有Xi或Yi是矩阵,其余的为向量,向量维数与矩阵的维数匹配,则按匹配的方向来分解矩阵,再分别将配对的向量画出。
plot(X1,Y1,LineSpec1,X2,Y2,LineSpec2…) 将按顺序分别画出由三参数定义Xi,Yi,LineSpeci的线条。其中参数LineSpeci指明了线条的类型,标记符号,和画线用的颜色。在plot 命令中我们可以混合使用三参数和二参数的形式:
plot(X1,Y1,LineSpec1,X2,Y2,X3,Y3,LineSpec3)
plot(…,\'PropertyName\',PropertyValue,…) 对所有的用plot生成的line图形对象中指定的属性进行恰当的设置。
h = plot(…) 返回line图形对象句柄的一列向量,一线条对应一句柄值。
说明 参数LineSpec
功能 定义线的属性。Maltab允许用户对线条定义如下的特性:
1.线型
表7-1
定义符 |
- |
-- |
: |
-. |
线型 |
实线(缺省值) |
划线 |
点线 |
点划线 |
2.线条宽度
指定线条的宽度,取值为整数(单位为像素点)
3.颜色
表7-2
定义符 |
R(red) |
G(green) |
b(blue) |
c(cyan) |
颜色 |
红色 |
绿色 |
兰色 |
青色 |
定义符 |
M(magenta) |
y(yellow) |
k(black) |
w(white) |
颜色 |
品红 |
黄色 |
黑色 |
白色 |
4.标记类型
表7-3
定义符 |
+ |
o(字母) |
* |
. |
x |
标记类型 |
加号 |
小圆圈 |
星号 |
实点 |
交叉号 |
定义符 |
d |
^ |
v |
> |
< |
标记类型 |
棱形 |
向上三角形 |
向下三角形 |
向右三角形 |
向左三角形 |
定义符 |
s |
h |
P |
||
标记类型 |
正方形 |
正六角星 |
正五角星 |
5.标记大小
指定标记符号的大小尺寸,取值为整数(单位为像素)
6.标记面填充颜色
指定用于填充标记符面的颜色。取值在上表。
7.标记周边颜色
指定标记符颜色或者是标记符(小圆圈、正方形、棱形、正五角星、正六角星和四个方向的三角形)周边线条的颜色。取值在上表。
在所有的能产生线条的命令中,参数LineSepc可以定义线条的下面三个属性:线型、标记符号、颜色进行设置。对线条的上述属性的定义可用字符串来定义,如:plot(x,y,\'-.or\')
结合x和y,画出点划线(-.),在数据点(x,y)处画出小圆圈(o),线和标记都用红色画出。其中定义符(即字符串)中的字母、符号可任意组合。若没有定义符,则画图命令plot自动用缺省值进行画图。若仅仅指定了标记符,而非线型,则plot只在数据点画出标记符。如:plot(x,y,’d’)
例7-1
>>t = 0:pi/20:2*pi;
>>plot(t,t.*cos(t),\'-.r*\')
>>hold on
>>plot(exp(t/100).*sin(t-pi/2),\'--mo\')
>>plot(sin(t-pi),\':bs\')
>>hold off
图形结果为图7-1。
例7-2
>>plot(t,sin(2*t),\'-mo\', \'LineWidth\',2,\'MarkerEdgeColor\',\'k\',…
\'MarkerFaceColor\',[.49 1 .63],\'MarkerSize\',12)
图形结果为图7-2。
图7-1 二维曲线图 图7-2 二维图形的绘制
命令2 fplot
功能 在指定的范围limits内画出一元函数y=f(x)的图形。其中向量x的分量分布在指定的范围内,y是与x同型的向量,对应的分量有函数关系:y(i)=f(x(i))。若对应于x的值,y返回多个值,则y是一个矩阵,其中每列对应一个f(x)。例如,f(x)返回向量[f1(x),f2(x),f3(x)],输入参量x=[x1;x2;x3],则函数f(x)返回矩阵
f1(x1) f2(x1) f3(x1)
f1(x2) f2(x2) f3(x2)
f1(x3) f2(x3) f3(x3)
注意一点的是,函数function必须是一个m-文件函数或者是一个包含变量x,且能用函数eval计算的字符串。例如:’sin(x)*exp(2*x)’,’[sin(x),cos(x)]’,’hump(x)’。
用法 fplot(\'function\',limits) 在指定的范围limits内画出函数名为function的一元函数图形。其中limits是一个指定x-轴范围的向量[xmin xmax]或者是x轴和y轴的范围的向量[xmin xmax ymin ymax]。
fplot(\'function\',limits,LineSpec) 用指定的线型LineSpec画出函数function。
fplot(\'function\',limits,tol) 用相对误差值为tol画出函数function。相对误差的缺省值为2e-3。
fplot(\'function\',limits,tol,LineSpec) 用指定的相对误差值tol和指定的线型LineSpec画出函数function的图形。
fplot(\'function\',limits,n) 当n>=1,则至少画出n+1个点(即至少把范围limits分成n个小区间),最大步长不超过(xmax-xmin)/n。
fplot(‘function’,lims,…) 允许可选参数tol,n和LineSpec以任意组合方式输入。
[X,Y] = fplot(\'function\',limits,…) 返回横坐标与纵坐标的值给变量X和Y,此时fplot不画出图形。若想画出,可用命令plot(X,Y)。
[…] = plot(\'function\',limits,tol,n,LineSpec,P1,P2,…) 允许用户直接给函数function输入参数P1,P2等,其中函数functiond的定义形式为
y = function(x,P1,P2,…)
若想用缺省的tol,n或LineSpec值,只需将空矩阵([ ])传递给函数即可。
注意:fplot采用自适应步长控制来画出函数function的示意图,在函数的变化激烈的区间,采用小的步长,否则采用大的步长。总之,使计算量与时间最小,图形尽可能精确。
例7-3
>>fplot(\'tanh\',[-2 2])
图形结果为图7-3。
>>subplot(2,2,1);fplot(\'humps\',[0 1])
>>subplot(2,2,2);fplot(\'abs(exp(-j*x*(0:9))*ones(10,1))\',[0 2*pi])
>>subplot(2,1,2);fplot(\'[tan(x),sin(x),cos(x)]\',2*pi*[-1 1 -1 1])
图7-3 函数画图 图7-4
命令3 loglog
功能 双对数图形。
用法 loglog(Y) 若y为实数向量或矩阵,则结合y列向量的下标与y的列向量画出。若y为复数向量或矩阵,则loglog(Y)等价于loglog(real(Y),imag(Y)),在loglog的其他使用形式中将忽略Y的虚数部分。
loglog(X1,Y1,X2,Y2…) 结合Xn与Yn画出图形。若只有Xn或Yn为矩阵,另一个为向量,行向量维数等于矩阵的列数,列向量的维数等于矩阵的行数,则loglog把矩阵按向量的方向分解成向量,再与向量结合分别画出图形。
loglog(X1,Y1,LineSpec1,X2,Y2,LineSpeec2…) 按顺序取三个参数Xn,Yn, LineSpecn画出线条,其中LineSpecn指定线条的线型,标记符号和颜色。用户可以混合使用二参数和三参数形式,如:
loglog(X1,Y1,X2,Y2,LineSpec2,X3,Y3)
loglog(…,\'PropertyName\',PropertyValue,…) 对所有由loglog命令生成的图形对象句柄的属性进行设置。
h = loglog(…) 返回line图形句柄向量,每条线对应一个句柄。
例7-4
>>x = logspace(-1,2);
>>loglog(x,10*exp(x),\'-s\')
>>grid on
图7-5
命令4 semilogx
功能 x轴对数图形。若没有指定使用的颜色,当所画线条较多时,semilogx将自动使用由当前轴的ColorOrder和LineStyleOrder属性指定的颜色顺序和线型顺序来画线。
用法 semilogx(Y) %对x轴的刻度求常用对数(以10为底),而y轴为线性刻度。若y为实数向量或矩阵,则结合y列向量的下标与y的列向量画出线条;若y为复数向量或矩阵,则semilogx(Y)等价于semilogx(real(Y),imag(Y))。在semilogx的其他使用形式中,Y的虚数部分将被忽略。
semilogx(X1,Y1,X2,Y2…) %结合Xn和Yn画出线条,若其中只有xn或yn为矩阵,另外一个为向量,行向量的维数等于矩阵的列数,列向量的维数等于矩阵的行数,则按向量的方向分解矩阵,再与向量结合,分别画出线条。
semilogx(X1,Y1,LineSpec1X2,Y2,LineSpec2,…) %按顺序取三参数Xn,Yn,LineSpecn画线,参数LineSpecn指定使用的线型,标记符号和颜色。用户可以混合使用二参数和三参数形式,如:
semilogx(X1,Y1,X2,Y2,LineSpec2,X3,Y3)
semilogx(…,\'PropertyName\',PropertyValue,…) %对所有由semilogx命令生成的图形对象句柄的属性进行设置
h = semilogx(…) %返回line图形句柄向量,每条线对应一个句柄。
例7-5
>>x = 0:.1:10;
>>semilogx(x,cos(10.^x))
图形结果为图7-6。
命令5 semilogy
用法:参见semilogx命令。
命令6 fill
功能 用颜色填充二维多边形。
用法 fill(X,Y,C) 用x和y中的数据生成多边形,用c指定的颜色填充它。其中c为色图向量或矩阵。若c是行向量,则要求c的维数等于x和y 的列数,若c为列向量,则要求c的维数等于x和y的行数。
fill(X,Y,ColorSpec) 用ColorSpec指定的颜色填充由x和y定义的多边形
fill(X1,Y1,C1,X2,Y2,C2,…) 指定多个要填充的二维区域
fill(…,\'PropertyName\',PropertyValue) 允许用户对一个patch图形对象的某个属性设定属性值。
h = fill(…) 返回patch图形对象句柄的向量,每一个patch对象对应一个句柄。
注意:
1. 若x或y是一矩阵,另一个是向量,向量应是维数与矩阵的行数相等的列向量或是维数等于矩阵列数的行向量时,函数fill将向量复制成与矩阵同型的矩阵。函数fill将矩阵x与y中列向量中的数据生成多边形的顶点。
2. 颜色阴影类型决定于用户在参数中列出的颜色,若用户用ColorSpec指定颜色,命令fill生成平坦阴影模式(flat-shaded)多边形,同时设置补片对象(patch)的FaceColor属性为相应的RGB颜色矩阵。
3. 若用户用参量c指定所用颜色,命令fill按坐标轴属性Clim的比例缩小c中的元素,之后,c成为引用当前色图的下标矩阵。
4. 若c为行向量,命令fill生成平面阴影的多边形,c的每一元素决定由矩阵x,y的每一列定义的多边形内的颜色,每一补片对象的FaceColor属性被设置为\'flat\',x,y的每一行元素变成第n块补片对象的Cdata属性值,其中n为矩阵x或y中的相应的列。
5. 若c为一列向量或一矩阵,命令fill运用一线性插值法计算每一节点的颜色,以便用插值颜色填充多边形的内部。它设置补片对象的FaceColor属性为‘interp’,且在一列中的元素变成每一补片的Cdata属性值。若c为一列向量,命令fill用该向量复制成需要大小的尺寸。
例7-6
>>t = (1/16:1/8:1)\'*2*pi;
>>x = exp(t).*sin(t);
>>y = t.*cos(t);
>>fill(x,y,\'k\')
>>grid on
图形结果为图7-7。
命令7 zoom
功能 对二维图形进行放大或缩小。放大或缩小会改变坐标轴范围。
用法 zoom on 打开交互式的放大功能。当一个图形处于交互式的放大状态时,有两种方法来放大图形:
对于一键鼠标或二键,三键鼠标,单击坐标轴内的任意一点,可使图形放大一倍,这一操作可进行多次,直到matlab的最大显示为止;对于二键或三键的鼠标,在坐标轴内单击右键,可使图形缩小一倍,这一操作可进行多次,直到还原图形为止。对于一键鼠标,要想缩小图形,需要按住键盘上的Shift键,再单击鼠标键。
用鼠标拖出要放大的部分,系统将放大选定的区域。
zoom off 关闭交互式放大功能。
zoom out 将系统转回非放大状态,并将图形恢复原状。
zoom reset 系统将记住当前图形的放大状态,作为放大状态的设置值。以后使用zoom out或者是双击鼠标时,交互式放大状态打开,且图形并不是返回到原状,而是返回reset时的放大状态。
zoom 用于切换放大的状态:on和off。
zoom xon 只对x轴进行放大。
zoom yon 只对y轴进行放大。
zoom(factor) 用放大系数factor进行放大或缩小,而不影响交互式放大的状态。若factor>1,系统将图形放大factor倍,若0<factor≤1,系统将图形放大1/factor倍。
zoom(fig, option) 指定对窗口fig中(不一定为当前窗口)的二维图形进行放大,其中参数option为:on、off、xon、yon、reset、factor等。
命令8 meshgrid
功能 生成二元函数z = f(x,y)中x-y平面上的矩形定义域中数据点矩阵X和Y,或者是三元函数u = f(x,y,z)中立方体定义域中的数据点矩阵X,Y和Z。
用法 a:[X,Y] = meshgrid(x,y)
b:[X,Y] = meshgrid(x)
c:[X,Y,Z] = meshgrid(x,y,z)
说明 对于形式a,输入向量x为x-y平面上矩形定义域的矩形分割线在x轴的值,向量y为x-y平面上矩形定义域的矩形分割线在y轴的值。输出向量X为x-y平面上矩形定义域的矩形分割点的横坐标值矩阵,输出向量Y为x-y平面上矩形定义域的矩形分割点的纵坐标值矩阵。
对于形式b,等价于形式a:[X,Y] = meshgrid(x) = meshgrid(x,x)。
对于形式c,输入向量x为立方体定义域的立方体分割平面在x轴上的值,输入向量y为立方体定义域的立方体分割平面在y轴上的值,输入向量z为立方体定义域的立方体分割平面在z轴上的值。输出向量X为立方体定义域中分割点的x轴坐标值,Y为立方体定义域中分割点的y轴坐标值,Z为立方体定义域中分割点的z轴坐标值。
例7-7
>>x = [0.7 1.1 ]; y = [-2 3 1]; z = [2 5 3]; %分量不一定从小到大
>>[X_2d,Y_2d] = meshgrid(x,y)
>>[X_3d,Y_3d,Z_3d] = meshgrid(x,y,z)
计算结果为:
X_2d =
0.7000 1.1000
0.7000 1.1000
0.7000 1.1000
Y_2d =
-2 -2
3 3
1 1
X_3d(:,:,1) =
0.7000 1.1000
0.7000 1.1000
0.7000 1.1000
X_3d(:,:,2) =
0.7000 1.1000
0.7000 1.1000
0.7000 1.1000
X_3d(:,:,3) =
0.7000 1.1000
0.7000 1.1000
0.7000 1.1000
Y_3d(:,:,1) =
-2 -2
3 3
1 1
Y_3d(:,:,2) =
-2 -2
3 3
1 1
Y_3d(:,:,3) =
-2 -2
3 3
1 1
Z_3d(:,:,1) =
2 2
2 2
2 2
Z_3d(:,:,2) =
5 5
5 5
5 5
Z_3d(:,:,3) =
3 3
3 3
3 3
7.1.2 特殊平面图形命令
命令1 polar
功能 画极坐标图。该命令接受极坐标形式的函数rho=f(θ),在笛卡儿坐标系平面上画出该函数,且在平面上画出极坐标形式的格栅。
用法 polar(theta,rho) 用极角theta和极径rho画出极坐标图形。极角theta为从x轴到半径的单位为弧度的向量,极径rho为各数据点到极点的半径向量。
polar(theta,rho,LineSpec) 参量LineSpec指定极坐标图中线条的线型、标记符号和颜色等。
例7-8
>>t = 0:.01:2*pi;
>>polar(t,sin(3*t).*cos(2*t),\'--r\')
图形结果为图7-8。
命令2 bar
功能 二维垂直条形图。用垂直条形显示向量或矩阵中的值。
用法 bar(Y) 若y为向量,则分别显示每个分量的高度,横坐标为1到length(y);若y为矩阵,则bar把y分解成行向量,再分别画出,横坐标为1到size(y,1),即矩阵的行数。
bar(x,Y) 在指定的横坐标x上画出y,其中x为严格单增的向量。若y为矩阵,则bar把矩阵分解成几个行向量,在指定的横坐标处分别画出。
bar(…,width) 设置条形的相对宽度和控制在一组内条形的间距。缺省值为0.8,所以,如果用户没有指定x,则同一组内的条形有很小的间距,若设置width为1,则同一组内的条形相互接触。
bar(…,\'style\') 指定条形的排列类型。类型有“group”和“stack”,其中“group”为缺省的显示模式。
“group”:若y为n*m阶的矩阵,则bar显示n组,每组有m个垂直条形的条形图。
“stack”:对矩阵y的每一个行向量显示在一个条形中,条形的高度为该行向量中的分量和。其中同一条形中的每个分量用不同的颜色显示出来,从而可以显示每个分量在向量中的分布。
bar(…,LineSpec) 用指定的颜色LineSpec显示所有的条形。
[xb,yb] = bar(…) 返回用户可用命令plot或命令patch画出条形图的参量xb,yb。这对用户控制一个图形的显示是有用的,例如要在一个plot语句中加入装饰性的条形图等。
h = bar(…) 返回一个patch图形对象句柄的向量。每一条形对应一个句柄。
例7-9
x = -2.9:0.2:2.9;
bar(x,exp(x.*sin(x)))
colormap gray
图形结果为图7-9。
例7-10
subplot(2,2,4)
bar(Y,1.5)
title \'Width = 1.5\'
图形结果为图7-10。
命令3 barh
功能 二维水平条形图。用水平条形显示向量或矩阵中的值。
用法 barh(Y) 若y为向量,则分别显示每个分量的高度,纵坐标为1到length(y);若y为矩阵,则bar把y分解成行向量,再分别画出,纵坐标为1到size(y,1),即矩阵的行数。
barh(x,Y) 在指定的纵坐标x上以水平方向画出y,其中x为严格单增的向量。若y为矩阵,则barh把矩阵分解成几个行向量,在指定的纵坐标处分别画出。
barh(…,width) 设置条形的相对宽度和控制在一组内条形的间距。缺省值为0.8,所以,如果用户没有指定x,则同一组内的条形有很小的间距,若设置width为1,则同一组内的条形相互接触。
barh(…,\'style\') 指定条形的排列类型。类型有“group”和“stack”,其中“group”为缺省的显示模式。
“group”:若y为n*m阶的矩阵,则bar显示n组,每组有m个水平条形的条形图。
“stack”:对矩阵y的每一个行向量显示在一个条形中,条形的高度为该行向量中的分量和。其中同一条形中的每个分量用不同的颜色显示出来,从而可以显示每个分量在向量中的分布。
barh(…,LineSpec) 用指定的颜色LineSpec显示所有的条形。
[xb,yb] = barh(…) 返回用户可用命令plot或命令patch画出条形图的参量xb,yb。这给用户控制一个图形的显示是有用的,例如要在一个plot语句中加入装饰性的条形图等。
h = barh(…) 返回一个patch图形对象句柄的向量。每一条形对应一个句柄。
例7-11
>>X = 1:.5:5;
>>Y = exp(X).*sin(X)
请发表评论