分享

MATLAB函数画图

 绝地战士 2010-07-25

?作为一个功能强大的工具软件,Matlab具有很强的图形处理功能,提供了大量的二维、三维图形函数。由于系统采用面向对象的技术和丰富的矩阵运算,所以在图形处理方面即常方便又高效。

二维图形

 ?      一、 plot函数

 ?      函数格式 plot(x,y)   其中x y 为坐标向量

 ?      函数功能 :以向量x y 为轴,绘制曲线。

    ?      【例1 在区间0X2p内,绘制正弦曲线Y=SINX),其程序为:

x=0:pi/100:2*pi;

y=sin(x);

plot(x,y)

 

     ?      【例2同时绘制正、余弦两条曲线Y1=SINX)和Y2=COSX),其程序为:

x=0:pi/100:2*pi;

y1=sin(x);

y2=cos(x);

plot(x,y1,x,y2)

   ?plot函数还可以为plot(x,y1,x,y2,x,y3,…)形式,其功能是以公共向量x为X轴,分别以y1,y2,y3,…为Y轴,在同一幅图内绘制出多条曲线。

 

?      (一)线型与颜色

?      格式:plot(x,y1,’cs’,...)

?      其中c表示颜色, s表示线型。

 

?(二)图形标记

?在绘制图形的同时,可以对图形加上一些说明,如图形名称、图形某一部分的含义、坐标说明等,将这些操作称为添加图形标记。

?title(‘加图形标题');     

?xlabel('X轴标记');    

?ylabel('Y轴标记');      

?text(X,Y,'添加文本');

 

?(三)设定坐标轴

?用户若对坐标系统不满意,可利用axis命令对其重新设定。

?axis([xmin xmax ymin ymax]) 设定最大和最小值

?axis auto’ 将坐标系统返回到自动缺省状态

?axis square’   将当前图形设置为方形

?axis equal’    两个坐标因子设成相等

?axis off’      关闭坐标系统

?axis on’       显示坐标系统

 

 

?      【例4  在坐标范围0≤X≤2π,-2≤Y≤2内重新绘制正弦曲线,其程序为:

x=linspace(0,2*pi,60);生成含有60个数据元素的向量X

y=sin(x);

plot(x,y);

axis ([0 2*pi -2 2]);设定坐标轴范围

 

 

?      (四)加图例

?      给图形加图例命令为legend。该命令把图例放置在图形空白处,用户还可以通过鼠标移动图例,将其放到希望的位置。

?      格式:legend('图例说明','图例说明'); 

 

?      (一)subplotm,n,p

?      该命令将当前图形窗口分成m×n个绘图区,即每行n个,共m行,区号按行优先编号,且选定第p个区为当前活动区。

 

?      6 在一个图形窗口中同时绘制正弦、余弦、正切、余切曲线,程序为:

?      x=linspace(0,2*pi,60);

?      y=sin(x);

?      z=cos(x);

?      t=sin(x)./(cos(x)+eps); eps为系统内部常数

?      ct=cos(x)./(sin(x)+eps);

?     subplot(2,2,1); 分成2×2区域且指定1号为活动区

?      plot(x,y);

?      title('sin(x)');                

?      axis ([0 2*pi -1 1]);           

?     subplot(2,2,2);

 

 

?(二)多图形窗口

?需要建立多个图形窗口,绘制并保持每一个窗口的图形,可以使用figure命令。

?每执行一次figure命令,就创建一个新的图形窗口,该窗口自动为活动窗口,若需要还可以返回该窗口的识别号码,称该号码为句柄。句柄显示在图形窗口的标题栏中,即图形窗口标题。用户可通过句柄激活或关闭某图形窗口,而axisxlabeltitle等许多命令也只对活动窗口有效。

 

?    重新绘制上例4个图形,程序变动后如下:

?      x=linspace(0,2*pi,60);

?      y=sin(x);

?      z=cos(x);

?      t=sin(x)./(cos(x)+eps);  

?      ct=cos(x)./(sin(x)+eps);

?     H1=figure; 创建新窗口并返回句柄到变量H1

?      plot(x,y); 绘制图形并设置有关属性

?      title('sin(x)');          

?      axis ([0 2*pi -1 1]);    

?     H2=figure; 创建第二个窗口并返回句柄到变量H2

?      plot(x,z); 绘制图形并设置有关属性

?      title('cos(x)');

 

 

?      (三)hold命令

?      若在已存在图形窗口中用plot命令继续添加新的图形内容,可使用图形保持命令hold。发出命令hold on后,再执行plot命令,在保持原有图形或曲线的基础上,添加新绘制的图形。

 

?      阅读如下程序:

?     x=linspace(0,2*pi,60);

?     y=sin(x);

?     z=cos(x);

?     plot(x,y,'b');           绘制正弦曲线

?    hold on;                  设置图形保持状态

?     plot(x,z,'g');           保持正弦曲线同时绘制余弦曲线

?     axis ([0 2*pi -1 1]);    

?     legend('cos','sin');

?    hold off                  关闭图形保持

 

 

?      三、  函数f(x)曲线

?      fplot函数则可自适应地对函数进行采样,能更好地反应函数的变化规律。

?      fplot函数格式:fplot(fnamelimstol)

?      其中fname为函数名,以字符串形式出现,lims为变量取值范围,tol为相对允许误差,其其系统默认值为2e-3

?      例:fplot(‘sinx,[0  2*pi],’-+’)          

?      fplot(‘[sin(x),cos(x)]’,[0  2*pi],1e-3,’·’)   同时绘制正弦、余弦曲线

 

?      为绘制f(x)=cos(tan(πx))曲线,可先建立函数文件fct.m,其内容为:

function  y=fct(x)

         y=cos(tan(pi*x));

fplot函数调用fct.m函数,其命令为:

fplot(‘fct’,[0  1],1e-4)

 

特殊坐标图形

?      一、  对数坐标图形

?      (一)loglog(x,y) 双对数坐标

?      【例7  绘制y=|1000sin(4x)|+1的双对数坐标图。程序为:

?   x=[0:0.1:2*pi]

?   y=abs(1000*sin(4*x))+1

?  loglog(x,y); 双对数坐标绘图命令

 

?      (二)单对数坐标

?      X轴为对数重新绘制上述曲线,程序为:

x=[0:0.01:2*pi]

y=abs(1000*sin(4*x))+1

semilogx(x,y); 单对数X轴绘图命令

?      同样,可以以Y轴为对数重新绘制上述曲线,程序为:

x=[0:0.01:2*pi]

y=abs(1000*sin(4*x))+1

semilogy(x,y); 单对数Y轴绘图命令

 

?      二、  极坐标图

函数polar(theta,rho)用来绘制极坐标图,theta为极坐标角度,rho为极坐标半径

?      【例8 绘制sin(2*θ)*cos(2*θ)极坐标图,程序为:

theta=[0:0.01:2*pi];

rho=sin(2*theta).*cos(2*theta);

polar(theta,rho); 绘制极坐标图命令

title('polar plot');

其它图形函数

?      plot等基本绘图命令外,Matlab系统提供了许多其它特殊绘图函数,这里举一些代表性例子,更详细的信息用户可随时查阅在线帮助,其对应的M-file文件存放在系统\matlab\toolbox\matlab目录下。

其它图形函数

?      一、阶梯图形

?    函数stairs(x,y)可以绘制阶梯图形,如下列程序段:

x=[-2.5:0.25:2.5];

y=exp(-x.*x);

stairs(x,y); 绘制阶梯图形命令

title('stairs  plot');

 

其它图形函数

?      二、条形图形

?   函数bar(x,y)可以绘制条形图形,如下列程序段将绘制条形图

x=[-2.5:0.25:2.5];

y=exp(-x.*x);

bar(x,y); 绘制条形图命令

其它图形函数

?      三、填充图形

?     fill(x,y,’c’)函数用来绘制并填充二维多边图形,xy为二维多边形顶点坐标向量。字符c’ 规定填充颜色,其取值前已叙述。

?      下述程序段绘制一正方形并以黄色填充:

其它图形函数

?    x=[0 1 1 0 0]; 正方形顶点坐标向量

?    y=[0 0 1 1 0];

?    fill(x,y,'y');绘制并以黄色填充正方形图

?      再如:

?    x=[0:0.025:2*pi];

?    y=sin(3*x);

?    fill(x,y,[0.5 0.3 0.4]); 颜色向量

?     Matlab系统可用向量表示颜色,通常称其为颜色向量。基本颜色向量用[r g b]表示,即RGB颜色组合;以RGB为基本色,通过 r,g,b0~1范围内的不同取值可以组合出各种颜色。

二维绘图函数小结

?     plot         二维图形基本函数

?     fplot        f(x)函数曲线绘制

?     fill         填充二维多边图形

?     polar        极坐标图

?     bar          条形图

?     loglog       双对数坐标图

?     semilogx    X轴为对数的坐标图

?     semilogy    Y轴为对数的坐标图

?     stairs       阶梯形图

?     axis         设置坐标轴

?     clf       清除图形窗口内容

?     close        关闭图形窗口

 

三维图形

?一、 plot3函数

?最基本的三维图形函数为plot3,它是将二维函数plot的有关功能扩展到三维空间,用来绘制三维图形。

?函数格式:plot3(x1,y1,z1,c1,x2,y2,z2,c2,…) 

?其中x1,y1,z1表示三维坐标向量,c1c2表示线形或颜色。

?函数功能:以向量xyz为坐标,绘制三维曲线。

 

?      【例9 绘制三维螺旋曲线,其程序为:

?    t=0:pi/50:10*pi;

?    y1=sin(t),y2=cos(t);

?    plot3(y1,y2,t);

?    title('helix'),text(0,0,0,'origin');

?    xlabel('sin(t)'),ylabel('cos(t)'),zlabel('t');

?    grid;

 

?      二、mesh函数

?     mesh函数用于绘制三维网格图。在不需要绘制特别精细的三维曲面结构图时,可以通过绘制三维网格图来表示三维曲面。三维曲面的网格图最突出的优点是:它较好地解决了实验数据在三维空间的可视化问题。

?   函数格式:mesh(x,y,z,c)

?    其中xy控制XY轴坐标,矩阵z是由(xy)求得Z轴坐标,(x,y,z)组成了三维空间的网格点;c用于控制网格点颜色。

 

?      三、surf函数

?    surf用于绘制三维曲面图,各线条之间的补面用颜色填充。surf函数和mesh函数的调用格式一致。

?   函数格式: surf (x,y,z)

?    其中xy控制XY轴坐标,矩阵z是由xy求得的曲面上Z轴坐标。

 

?      四、视点

?      视点位置可由方位角和仰角表示。方位角又称旋转角为视点位置在XY平面上的投影与X轴形成的角度,正值表示逆时针,负值表示顺时针。仰角又称视角为XY平面的上仰或下俯角,正值表示视点在XY平面上方,负值表示视点在XY平面下方。从不同视点绘制三维图形的函数为view

?       view(az,el)中的az为方位角,el为仰角。通过系统提供的多峰函数peaks的绘制例子,可进一步说明视点对图形的影响,以及view(az,el)函数的使用。

 

?      【例12  不同视角图形

?     p=peaks; 系统提供的多峰函数

?     subplot(2,2,1);

?     mesh(peaks,p);

?    view(-37.5,30); 指定子图1的视点

?     title('azimuth=-37.5,elevation=30')

?     subplot(2,2,2);

?     mesh(peaks,p);

?    view(-17,60); 指定子图2的视点

?     title('azimuth=-17,elevation=60')

 

 

?      五、等高线图

?      等高线图可通过函数contour3绘制。

?      【例13 峰函数peaks等高线图

?   [x,y,z]=peaks(30);

?   contour3(x,y,z,16);

?     xlabel('x-axis'),ylabel('y-axis'),zlabel('z-axis');

?   title('contour3 of peaks')

图形句柄

?一、句柄

?Matlab系统中,绘图命令产生的每一个部分称为图形对象,系统在创建每一个对象时,都为该对象分配唯一的一个值,称其为句柄,因此句柄就是图形对象标识符。对象、句柄以及图形对象等概念其实质是统一的,系统将每一个对象按树型层次结构组织起来,这些对象包括根对象,通常为计算机屏幕、图形窗口、坐标系统、线条、曲面、文本串、用户界面控制等。

 

?根对象可包含一个或多个图形窗口对象,而一个图形窗口对象又可包含一组或多组坐标系子对象,线条、文本等其它对象都是坐标系的子对象。所有创建对象的函数当父对象不存在时,都会自动创建它。

?计算机屏幕作为根对象自动建立,其句柄值为0。而Hf_f=figure命令则建立图形窗口对象,并返回它的句柄值给变量Hf_f。图形窗口的句柄为一整数,并显示在该窗口的标题栏,其它图形对象的句柄为浮点数,Matlab提供了一系列与句柄操作有关的函数,如gcf gca等。为便于识别,用大写字母开头的变量表示句柄,如Hf_f等。

 

?      二、对象属性

?       所有图形对象都具有控制对象显示的属性。这些属性既包括对象的一般信息,如对象类型、对象的父对象及子对象等,也包括对象的一些特定信息,如坐标系对象的刻度等。用户可以获取、设置对象属性,以达到控制对象的目的。当创建一个对象时,系统用一组默认属性值定制对象,用户梢酝üget命令获取这些属性值,同时也可通过set命令重新设置对象属性。

?      set命令格式为:

?     set(H,’name’,value…)   将图形对象Hname属性设置为value

?      其中H为句柄,name为属性名,valuename的属性值。

图形句柄

?      set命令可以方便地设置图形对象属性,如下列程序段就是通过属性来定制图形。

?    x=[0:0.1:4*pi];

?    H=plot(x,sin(x)); 返回正弦曲线句柄H

?    set(H,'LineStyle','*','LineWidth',0.1);设置正弦曲线线型与线宽

?   其中'LineStyle'为线型属性,'LineWidth'为线宽属性。

图形句柄

?     利用get(H)命令可以返回当前句柄H对象的属性。

?   键入命令:get(H) 系统返回当前图形对象的有关属性:

?   H=get(0,’CurrentFigure’)则返回根对象的CurrentFigure’的属性值,即当前图形窗口的句柄,相当于函数gcfget(gcf,’Children’)则返回当前坐标系对象的句柄;类似的操作用户可在使用Matlab的过程中不断积累。

图形句柄

?      三、句柄应用

?      利用句柄操作的有关函数,用户可以查找、访问图形对象,以达到定制对象属性,改变对象显示效果的目的。

?      x=-pi:pi/20:pi;

?      y=sin(x);z=cos(x);

?      plot(x,y,'r',x,z,'g');

?      Hl_lines=get(gca,'Children'); 获取正、余曲线句柄向量Hl_lines

?      for k=1:size(Hl_lines)         

?      if get(Hl_lines(k),‘Color’)==[0 1 0]    [0 1 0]为绿颜色向    Hl_green=Hl_lines(k)         返回绿色线条句柄

?         end

?      end

动画设计

?      如果将Matlab产生的多幅图形保存起来,并利用系统提供的函数进行播放,就可产生动画效果。系统所提供的动画功能函数有getframemovieinmovie

 

?      getframe函数

?      getframe函数可将当前图形窗口作为一个画面取下并保存,格式为:m=getframe它将每一帧画面信息数据截取下来整理成列向量。该函数截取图形的点阵信息,图形窗口的大小,对数据向量的大小影响较大,窗口越大,所需存储容量越大。而图形的复杂性对数据容量要求没有直接的关系。

动画设计

?      moviein函数

?      函数m=moviein(n)用来建立一个足够大的n列的矩阵m,用来保存n幅画面的数据,以备播放。

?      movie函数

?      movie(m,n)以每秒n幅图形的速度播放由矩阵m的列向量所组成的画面。

动画设计

?      【例14 播放一个不断变化的眼球程序段。

?    m=moviein(20); 建立一个20个列向量组成的矩阵

?    for j=1:20

?       plot(fft(eye(j+10))) 绘制出每一幅眼球图并保存到m矩阵中

?       m(:,j)=getframe;

?    end

?    movie(m,10);以每秒10幅的速度播放画面

动画设计

?    再如下述程序段播放一个直径不断变化的球体。

?    n=30

?    [x,y,z]=sphere

?    m=moviein(n);

?    for j=1:n

?       surf(i*x,i*y,i*z)

?       m(:,j)=getframe;

?    end

?    movie(m,30);

 

习题

?      1.在[0 2π]范围内绘制二维曲线图

          y=sin(x)*cos(5x)

?      2.在[0  2π]范围内绘制以Y轴为对数的二维曲线图, y=|1000sin(4x)|+1

?      3. [6  2]范围内用plotfplot函数分别绘制二维曲线图。

?      4.绘制z=sin(x)*cos(y)的三维网格和三维曲面图,x,y变化范围均为 [0  2π]

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多