• matlab 数据可视化


    视觉是人们感受世界、认识自然的最重要依靠。数据可视化的目的在于:通过图形,从一堆杂乱的离散数据中观察数据间的内在关系,感受由图形所传递的内在本质。MATLAB一向注重数据的图形表示,并不断地采用新技术改进和完备其可视化功能。  
    本章将系统地阐述:离散数据表示成图形的基本机理;曲线、曲面绘制的基本技法和指令;特殊图形的生成和使用示例;如何使用线型、色彩、数据点标记凸现不同数据的特征;如何利用着色、灯光照明、反射效果、材质体现和透明度处理渲染、烘托表现高维函数的性状;如何生成和运用标识,画龙点睛般地注释图形;如何显示和转换unit8unit16double三种不同数据类型所体现的变址、灰度和真彩图象,如何读写各种标准图象格式文件;如何通过图形窗的交互操作对图形进行修饰、调整;如何打印和输出图形文件。  
    本章的图形指令只涉及MATLAB"高层"绘图指令。这种指令的形态和格式友善,易于理解和使用。  
    整章内容遵循由浅入深、由基本到高级、由算例带归纳的原则。所有算例都是运行实例,易于读者实践试验,并从中掌握一般规律。  
    4.1 引导  
    4.1.1 离散数据和离散函数的可视化  
    【例4.1.1-1】用图形表示离散函数   
    n=0:12;  
    y=1./abs(n-6);  
    plot(n,y,’r*’,’MarkerSize’,20)  
    grid on   
    Warning: Divide by zero.  
    4.1.2 连续函数的可视化  
    【例4.1.2-1】用图形表示连续调制波形   
    t1=(0:11)/11*pi; % <1>  
    y1=sin(t1).*sin(9*t1);  
    t2=(0:100)/100*pi; % <3>  
    y2=sin(t2).*sin(9*t2);  
    subplot(2,2,1),plot(t1,y1,’r.’),axis([0,pi,-1,1]),title(’子图 (1)’)  
    subplot(2,2,2),plot(t2,y2,’r.’),axis([0,pi,-1,1]),title(’子图 (2)’)  
    subplot(2,2,3),plot(t1,y1,t1,y1,’r.’)  
    axis([0,pi,-1,1]),title(’子图 (3)’)  
    subplot(2,2,4),plot(t2,y2)  
    axis([0,pi,-1,1]),title(’子图 (4)’)   

    4.2.1 plot的基本调用格式  
    【例4.2.1-1】简单例题,比较方便的试验指令。  
    t=(0:pi/50:2*pi)’;k=0.4:0.1:1;Y=cos(t)*k;plot(t,Y)    

    【例4.2.1-2】用图形表示连续调制波形  及其包络线。  
    t=(0:pi/100:pi)’; % <1>  
    y1=sin(t)*[1,-1]; % <2>  
    y2=sin(t).*sin(9*t); % <3>  
    t3=pi*(0:9)/9; % <4>  
    y3=sin(t3).*sin(9*t3);plot(t,y1,’r:’,t,y2,’b’,t3,y3,’bo’) % <5>  
    axis([0,pi,-1,1]) % <6>    

    【例4.2.1-3】用复数矩阵形式画Lissajous图形。(在模拟信号时代,Lissajous图形常用来测量信号的频率。)  
    t=linspace(0,2*pi,80)’; % <1>  
    X=[cos(t),cos(2*t),cos(3*t)]+i*sin(t)*[1, 1, 1]; %(80x3)的复数矩阵  
    plot(X) % <3>  
    axis square % <4>  
    legend(’1’,’2’,’3’)    

    【例4.2.1-4】采用模型 画一组椭圆。  
    th = [0:pi/50:2*pi]’;  
    a = [0.5:.5:4.5];  
    X = cos(th)*a;  
    Y = sin(th)*sqrt(25-a.^2);  
    plot(X,Y),axis(’equal’),xlabel(’x’), ylabel(’y’)  
    title(’A set of Ellipses’)    

    4.2.2 曲线的色彩、线型和数据点形  
    4.2.2.1 色彩和线型  
    4.2.2.2 数据点形  
    【例4.2.2.2-1】用图形演示平面上一个方块四个顶点在仿射投影(Affine Projection)下的位置、形状变化。  
     
    p1=[-0.5,0,1]’;p2=[-0.5,1,1]’;p3=[0.5,1,1]’;p4=[0.5,0,1]’;  
    Sq=[p1,p2,p3,p4,p1];  
     
    dx=0.5;dy=1;T=[1,0,dx;0,1,dy;0,0,1];  
     
    th=pi/6;R=[cos(th),-sin(th),0;sin(th),cos(th),0;0,0,1];  
     
    alpha=2;beta=3;S=[alpha,0,0;0,beta,0;0,0,1];  
    E=eye(3,3);% <10>  
    TRS={E,T,R,S}; %<11>  
    ss={’r^’,’rd’,’rp’,’rh’}; %<12>  
    tt={’Original Square’,’Translation’,’Rotation’,’Scaling’};  
    % <13>  
    for i=1:4  
    W=TRS{i}*Sq; %  
    subplot(2,2,i)  
    for k=1:4  
    plot(W(1,k),W(2,k),ss{k}); % <19>  
    axis([-3,3,-1,5]),axis equal  
    hold on % <21>  
    end  
    plot(W(1,:),W(2,:)) % <23>  
    grid on %  
    title(tt{i}) %  
    hold off %  
    end  

    4.2.3 坐标、刻度和分格线控制  
    4.2.3.1 坐标控制  
    【例4.2.3.1-1】观察各种轴控制指令的影响。演示采用长轴为3.25,短轴为1.15的椭圆。注意:采用多子图表现时,图形形状不仅受"控制指令"影响,而且受整个图面"宽高比""子图数目"的影响。本书这样处理,是出于篇幅考虑。读者欲想准确体会控制指令的影响,请在全图状态下进行观察。(图4.2-6  
    t=0:2*pi/99:2*pi;  
    x=1.15*cos(t);y=3.25*sin(t); %  
    subplot(2,3,1),plot(x,y),axis normal,grid on,  
    title(’Normal and Grid on’)  
    subplot(2,3,2),plot(x,y),axis equal,grid on,title(’Equal’)  
    subplot(2,3,3),plot(x,y),axis square,grid on,title(’Square’)  
    subplot(2,3,4),plot(x,y),axis image,box off,title(’Image and Box off’)  
    subplot(2,3,5),plot(x,y),axis image fill,box off  
    title(’Image and Fill’)  
    subplot(2,3,6),plot(x,y),axis tight,box off,title(’Tight’)    

    4.2.3.2 刻度、分格线和坐标框  
    【例4.2.3.2-1】通过绘制二阶系统阶跃响应,综合演示图形标识。本例比较综合,涉及的指令较广。请读者耐心读、实际做、再看例后说明,定会有匪浅收益。(图4.2-7   
    clf;t=6*pi*(0:100)/100;y=1-exp(-0.3*t).*cos(0.7*t);  
    tt=t(find(abs(y-1)>0.05));ts=max(tt); %<2>  
    plot(t,y,’r-’,’LineWidth’,3) %<3>  
    axis([-inf,6*pi,0.6,inf]) %<4>  
    set(gca,’Xtick’,[2*pi,4*pi,6*pi],’Ytick’,[0.95,1,1.05,max(y)]) %<5>  
    grid on %<6>  
    title(’it y = 1 - e^{ -alphat}cos{omegat}’) %<7>  
    text(13.5,1.2,’fontsize{12}{alpha}=0.3’) %<8>  
    text(13.5,1.1,’fontsize{12}{omega}=0.7’) %<9>  
    hold on;plot(ts,0.95,’bo’,’MarkerSize’,10);hold off %<10>  
    cell_string{1}=’fontsize{12}uparrow’; %<11>  
    cell_string{2}=’fontsize{16} fontname{隶书}镇定时间’; %<12>  
    cell_string{3}=’fontsize{6}  ’; %<13>  
    cell_string{4}=[’fontsize{14} mt_{s} = ’ num2str(ts)]; %<14>  
    text(ts,0.85,cell_string) %<15>  
    xlabel(’fontsize{14} ft  ightarrow’) %<16>  
    ylabel(’fontsize{14} fy  ightarrow’)   %<17>   

    4.2.4 图形标识  
    4.2.4.1 简捷指令形式  
    4.2.4.2 精细指令形式  
    【例4.2.4.2-1】本例非常简单,专供试验标识用。  
    clf;t=0:pi/50:2*pi;y=sin(t);plot(t,y);axis([0,2*pi,-1.2,1.2])  
    text(pi/2,1,’fontsize{16}leftarrowitsin(t)fontname{隶书}极大值’)    

    4.2.5 多次叠绘、双纵坐标和多子图  
    4.2.5.1 多次叠绘  
    【例4.2.5.1-1】利用hold绘制离散信号通过零阶保持器后产生的波形。  
    t=2*pi*(0:20)/20;y=cos(t).*exp(-0.4*t);  
    stem(t,y,’g’);hold on;stairs(t,y,’r’);hold off    

    4.2.5.2 双纵坐标图  
    【例4.2.5.2-1】画出函数 和积分 在区间 上的曲线。  
    clf;dx=0.1;x=0:dx:4;y=x.*sin(x);s=cumtrapz(y)*dx; %梯形法求累计积分  
    plotyy(x,y,x,s),text(0.5,0,’fontsize{14}ity=xsinx’)  
    sint=’{fontsize{16}int_{fontsize{8}0}^{  x}}’;  
    text(2.5,3.5,[’fontsize{14}its=’,sint,’fontsize{14}itxsinxdx’])    

    【例4.2.5.2-2】受热压力容器的期望温度是120度,期望压力是0.25Mpa。在同一张图上画出它们的阶跃响应曲线。  
    S1=tf([1 1],[1 3  2  1]);  
    S2=tf(1,[1 1 1]);  
    [Y1,T1]=step(S1);  
    [Y2,T2]=step(S2);  
    plotyy(T1,120*Y1,T2,0.25*Y2,’stairs’,’plot’)    

    4.2.5.3 多子图  
    【例4.2.5.3-1】演示subplot指令对图形窗的分割。  
    clf;t=(pi*(0:1000)/1000)’;  
    y1=sin(t);y2=sin(10*t);y12=sin(t).*sin(10*t);  
    subplot(2,2,1),plot(t,y1);axis([0,pi,-1,1])  
    subplot(2,2,2),plot(t,y2);axis([0,pi,-1,1])  
    subplot(’position’,[0.2,0.05,0.6,0.45]) %<5>  
    plot(t,y12,’b-’,t,[y1,-y1],’r:’);axis([0,pi,-1,1])    

    4.2.6 交互式图形指令  
    4.2.6.1 ginput  
    4.2.6.2 gtext  
    4.2.6.3 legend  
    4.2.6.4 zoom 

    4.3.1 三维线图指令plot3  
    【例4.3.1-1】简单例题。  
    t=(0:0.02:2)*pi;x=sin(t);y=cos(t);z=cos(2*t);  
    plot3(x,y,z,’b-’,x,y,z,’bd’),view([-82,58]),box on,legend(’’,’宝石’)    

    4.3.2 三维网线图和曲面图  
    4.3.2.1 三维图形的数据准备  
    4.3.2.2 网线图、曲面图基本指令格式  
    【例4.3.2.2-1】用曲面图表现函数   
    clf,x=-4:4;y=x;[X,Y]=meshgrid(x,y);  
    Z=X.^2+Y.^2;  
    surf(X,Y,Z);hold on,colormap(hot)  
    stem3(X,Y,Z,’bo’)    

    4.3.3 透视、镂空和裁切  
    4.3.3.1 图形的透视  
    【例4.3.3.1-1】透视演示  
    [X0,Y0,Z0]=sphere(30);  
    X=2*X0;Y=2*Y0;Z=2*Z0;  
    surf(X0,Y0,Z0);  
    shading interp  
    hold on,mesh(X,Y,Z),colormap(hot),hold off  
    hidden off  
    axis equal,axis off    

    4.3.3.2 图形的镂空  
    【例4.3.3.2-1】演示:如何利用"非数"NaN,对图形进行剪切处理。  
    t=linspace(0,2*pi,100); r=1-exp(-t/2).*cos(4*t);  
    [X,Y,Z]=cylinder(r,60);  
    ii=find(X<0&Y<0);  
    Z(ii)=NaN;  
    surf(X,Y,Z);colormap(spring),shading interp  
    light(’position’,[-3,-1,3],’style’,’local’)  
    material([0.5,0.4,0.3,10,0.3])    

    【例4.3.3.2-2】演示:如何利用"非数"NaN,对图形进行镂空处理。  
    P=peaks(30);P(18:20,9:15)=NaN;  
    surfc(P);colormap(summer)  
    light(’position’,[50,-10,5]),lighting flat  
    material([0.9,0.9,0.6,15,0.4])    

    4.3.3.3 裁切  
    【例4.3.3.3-1】表现切面  
    clf,x=[-8:0.05:8];y=x;[X,Y]=meshgrid(x,y);ZZ=X.^2-Y.^2;  
    ii=find(abs(X)>6|abs(Y)>6);  
    ZZ(ii)=zeros(size(ii));  
    surf(X,Y,ZZ),shading interp;colormap(copper)  
    light(’position’,[0,-15,1]);lighting phong  
    material([0.8,0.8,0.5,10,0.5])  

     

    4.4.1 特殊图形指令例示  
    4.4.1.1 面域图area  
    【例4.4.1.1-1】面域图指令area 。该指令的特点是:在图上绘制多条曲线时,每条曲线(除第一条外)都是把""条曲线作基线,再取值绘制而成。因此,该指令所画的图形,能醒目地反映各因素对最终结果的贡献份额。注意:(1area的第一输入宗量是单调变化的自变量。第二输入宗量是"各因素"的函数值矩阵,且每个"因素"的数据取列向量形式排放。第三输入宗量是绘图的基准线值,只能取标量。当基准值为0(即以x轴为基准线)时,第三输入宗量可以缺省。(2)本例第<4>条指令书写格式x’ , Y’  强调沿列方向画各条曲线的事实。  
    clf;x=-2:2  
    Y=[3,5,2,4,1;3,4,5,2,1;5,4,3,2,5]  
    Cum_Sum=cumsum(Y)  
    area(x’,Y’,0) %<4>  
    legend(’因素A’,’因素B’,’因素C’),grid on,colormap(spring)    
    x =  
        -2    -1     0     1     2  
    Y =  
         3     5     2     4     1  
         3     4     5     2     1  
         5     4     3     2     5  
    Cum_Sum =  
         3     5     2     4     1  
         6     9     7     6     2  
        11    13    10     8     7  

    4.4.1.2 各种直方图bar, barh, bar3, bar3h  
    【例4.4.1.2-1】二维直方图有两种图型:垂直直方图和水平直方图。而每种图型又有两种表现模式:累计式:分组式。本例选其两种加以表现。  
    x=-2:2;  
    Y=[3,5,2,4,1;3,4,5,2,1;5,4,3,2,5];  
    subplot(1,2,1),bar(x’,Y’,’stacked’)  
    xlabel(’x’),ylabel(’Sigma y’),colormap(cool)  
    legend(’因素A’,’因素B’,’因素C’)  
    subplot(1,2,2),barh(x’,Y’,’grouped’)  
    xlabel(’y’),ylabel(’x’)    

    【例4.4.1.2-2】用三维直方图表现上例数据。  
    clf;x=-2:2;  
    Y=[3,5,2,4,1;3,4,5,2,1;5,4,3,2,5];  
    subplot(1,2,1),bar3(x’,Y’,1)  
    xlabel(’因素ABC’),ylabel(’x’),zlabel(’y’)  
    colormap(summer)  
    subplot(1,2,2),bar3h(x’,Y’,’grouped’)  
    ylabel(’y’),zlabel(’x’)    

    4.4.1.3 饼图pie, pie3  
    【例4.4.1.3-1】饼图指令pie , pie3 用来表示各元素占总和的百分数。该指令第二输入宗量为与第一宗量同长的0-1向量,1使对应扇块突出。  
    a=[1,1.6,1.2,0.8,2.1];  
    subplot(1,2,1),pie(a,[1 0 1 0 0]),legend({’1’,’2’,’3’,’4’,’5’})  
    subplot(1,2,2),pie3(a,a==min(a)),colormap(cool)    
    4.4.1.4 填色图fill,fill3  
    【例4.4.1.4-1】读者试验本例时,注意三点:MATLAB画任意多边形的一种方法;保证绘图数据首尾重合,使勾画多边形封闭;使用图柄对图形的属性进行精细设置。  
    clf;n=10;  
    dt=2*pi/n;t=0:dt:2*pi;  
    t=[t,t(1)];  
    x=sin(t);y=cos(t);  
    fill(x,y,’c’);axis off  
    ht=text(0,0,’fontname{隶书}fontsize{32}十边形’);  
    set(ht,’Color’,’k’,’HorizontalAlignment’,’Center’)   

    【例4.4.1.4-2】三维填色指令fill3 演示。注意:(1X,Y,Z的相应列元素构成一个三维封闭多边形。本例有4列,因此有4个多边形。图4.4.1.4-2中的"1234"号三角形分别由X,Y,Z的第1234列生成。(2)为使多边形封闭,每列的首尾元素应该重合。若不重合,则将默认把最后一点与第一点相连,强行使多边形封闭。(3)该指令的第4输入宗量可取定色单字符(如’r’ , ’g’ 等),也可取与X同维的数值矩阵。(4)所填色彩受C和色图的双重响应。(5)本例图中三角形的编号是通过"图形窗"编辑而生成的。  
    X=[0.5 0.5 0.5 0.5;0.5 0.5 0.5 0.5;0 1 1 0];  
    Y=[0.5 0.5 0.5 0.5;0.5 0.5 0.5 0.5;0 0 1 1];  
    Z=[1 1 1 1;0 0 0 0;0 0 0 0];C=[1 0 0 1;0 1 0 1;0 0 1 0];  
    fill3(X,Y,Z,C),view([-10 55]),colormap cool  
    xlabel(’x’),ylabel(’y’),box on;grid on    

    4.4.1.5 射线图compass和羽毛图feather  
    【例4.4.1.5-1 compassfeather指令的区别。  
    t=-pi/2:pi/12:pi/2;  
    r=ones(size(t));  
    [x,y]=pol2cart(t,r);  
    subplot(1,2,1),compass(x,y),title(’Compass’)  
    subplot(1,2,2),feather(x,y),title(’Feather’)    
    4.4.1.6 Voronoi图和三角剖分  
    【例4.4.1.6-1】用Voronoi多边形勾画每个点的最近邻范围。Voronoi多边形在计算几何、模式识别中有重要应用。从本例图4.4-8中,可以看到,三角形顶点所在多边形的三条公共边是剖分三角形边的垂直平分线。  
    clf;rand(’state’,111)    
    n=30;A=rand(n,1)-0.5;B=rand(n,1)-0.5;  
    T=delaunay(A,B);  
    T=[T T(:,1)];  
    voronoi(A,B)  
    hold on;axis square  
    fill(A(T(10,:)),B(T(10,:)),’y’);  
    voronoi(A,B)    

    4.4.1.7 彩带图ribbon  
    【例4.4.1.7-1】用彩带绘图指令ribbon ,绘制归化二阶系统 在不同 值时的阶跃响应,如图4.4-9所示。对于本例程序,有以下几点值得注意:(1)程序中使用了Control Toolbox中的两个指令tf step 。这tf 是一个"对象"。(2)本例构作的S是一个单输入8输出系统,作用于该Sstep指令也将在一次调用中产生8个子系统的阶跃响应。(3)在下段程序运行后,有兴趣的读者可显示,以观察系统是如何描写的。(4)本例为了得到较好的表现效果,采用了视角、明暗、色图、光照控制。(5)为使程序有一定通用性,图例采用元胞数组生成。(6)本例产生的图4.4.1.7-1中,除" "外,所有标识都是由下段指令产生的。(7" "中的斜向箭头无法由指令生成,而是直接通过"图形窗"编辑实现的。(8)本例程序有通用性。只要修改第<2>条指令对阻尼系数的设定,就可获得相应的彩带图形。  
    view([150,50]),shading interp,colormap(jet)%  
    light,lighting phong,box on %  
    for k=1:n;str_lgd{k,1}=num2str(zeta2(k));end,legend(str_lgd)  
    str1=’itG = (s^{2} + 2zetas + 1)^{-1}’;  
    str2=’fontsize{16}fontname{隶书}取不同’;  
    str3=’{fontsize{10}itzeta}’;  
    str4=’fontsize{16}fontname{隶书}时的阶跃响应’;  
    title([str1,str2,str3,str4]),zlabel(’ity(zeta,t)  ightarrow’)   

    4.4.1.8 离散杆图stem , stem3  
    【例4.4.1.8-1】本例表现一个离散方波的快速Fourier变换的幅频。本例左图用极坐标指令polar绘出,右图用三维离散杆图指令stem3 绘出。  
    th = (0:127)/128*2*pi;  
    rho=ones(size(th));  
    x = cos(th);y = sin(th);  
    f = abs(fft(ones(10,1),128));  
    rho=ones(size(th))+f’;  
    subplot(1,2,1),polar(th,rho,’r’)  
    subplot(1,2,2),stem3(x,y,f’,’d’,’fill’)  
    view([-65 30])    

    4.4.1.9 二维半图指令pcolor, contour, contourf  
    【例4.4.1.9-1】本例重点演示所谓"二维半"指令:伪彩图pcolor ;等位线指令contour contourf;等位线标高指令 clabel 的配合使用和区别。练习本例时注意:(1)本例等位线指令中的第4输入宗量n设定高度的等级数,第5输入宗量设定等位线的线型、色彩。(2)左右两图的标高方法不同。左图的标识以"+"引导,水平放置。右图沿线布置。这是由clabel的调用格式不同产生的。(3)左右两图色彩的形成方法不同,色彩效果也不同。(4)在左图中,colorbar画出一根垂直色标尺,而caxis决定该色标尺的刻度。clf;clear;[X,Y,Z]=peaks(40);  
    n=4;  
    subplot(1,2,1),pcolor(X,Y,Z)  
    colormap jet,shading interp  
    hold on,C=contour(X,Y,Z,n,’k:’);  
    clabel(C)  
    zmax=max(max(Z));zmin=min(min(Z));caxis([zmin,zmax])  
    colorbar  
    hold off,subplot(1,2,2)  
    [C,h,CF]=contourf(X,Y,Z,n,’k:’);  
    clabel(C,h)  

     

    4.5.1 视点控制和图形的旋动  
    4.5.1.1 视点控制view  
    4.5.1.2 图形旋动rotate  
    【例 6.5.1.2-1】旋转指令示例。(利用rotate制作动画,请看例4.4.4.3-1  
    shg;clf;[X,Y] = meshgrid([-2:.2:2]);Z = 4*X.*exp(-X.^2-Y.^2);  
    G=gradient(Z);subplot(1,2,1),surf(X,Y,Z,G)  
    subplot(1,2,2),h=surf(X,Y,Z,G);  
    rotate(h,[-2,-2,0],30,[2,2,0]),colormap(jet)  

    4.5.2 色彩控制  
    4.5.2.1 用色风格colordef  
    4.5.2.2 色图colormap  
    【例4.5.2.2-1】红绿蓝三色色图。演示:色图和色图矩阵。  
    CM=[1 0 0;0 1 0;0 0 1];m=size(CM,1);Y=[1:m+1;1:m+1]’;  
    pcolor(Y),colormap(CM)    

    【例4.5.2.2-2】随机色图。演示:色图和色图矩阵。  
    rand(’seed’,2);CM=rand(16,3);m=size(CM,1);Y=[1:m+1;1:m+1]’;  
    pcolor(Y),colormap(CM)    

    【例4.5.2.2-3】演示:(A)用MATLAB预定义的两个色图矩阵,构成一个更大的色图阵。(B)把色轴的范围设置得比着色阵 C的数据范围小,使色图CM的两端色彩展宽,中间色彩压缩。(C)把色轴的上限增加一个C阵数据宽度,使着色时只使用色图CM上半阵的色彩。这种方法使同一图形窗中的不同对象实际上可以使用MATLAB的不同预定义色图。(D)为了使色标尺正确反映色轴的设置,指令colorbar必须在caxis 之后使用。  
    Z=peaks(20);C=Z;Cmin=min(min(C));Cmax=max(max(C));DC=Cmax-Cmin;  
    CM=[autumn;winter]; %<2>  
    colormap(CM),subplot(1,3,1),surf(Z,C)  
    caxis([Cmin+DC*2/5,Cmax-DC*2/5]),colorbar(’horiz’) %<4>  
    subplot(1,3,2),surf(Z,C),colorbar(’horiz’)  
    subplot(1,3,3),surf(Z,C),caxis([Cmin,Cmax+DC]),colorbar(’horiz’)%<6>    

    4.5.2.3 浓淡处理shading  
    【例4.5.2.3-1】三种浓淡处理方式比较。  
    clf;Z=peaks(20);colormap(jet)  
    subplot(1,3,1),surf(Z)  
    subplot(1,3,2),surf(Z),shading flat  
    subplot(1,3,3),surf(Z),shading interp    

    4.5.3 照明和材质处理  
    4.5.3.1 灯光light  
    4.5.3.2 照明模式lighting  
    4.5.3.3 控制光效果的材质指令material  
    4.5.3.4 surfl指令的精细调用格式  
    【例4.5.3.4-1】灯光、照明、材质指令所表现的图形。  
    clf;  
    [X,Y,Z]=sphere(40);  
    colormap(jet) %<3>  
    subplot(1,2,1);surf(X,Y,Z);shading interp %<4>  
    light (’position’,[2,-2,2],’style’,’local’) %<5>  
    lighting  phong %<6>  
    material([0.5,0.3,0.5,10,0.5]) %<7>  
    subplot(1,2,2);surf(X,Y,Z,-Z);shading flat %<8>  
    light;lighting flat %<9>  
    light(’position’,[-1,-1,-2],’color’,’y’) %<10>  
    light(’position’,[-1,0.5,1],’style’,’local’,’color’,’w’) %<11>  
    material([0.4,0.5,0.3,10,0.3]) %<12>    

    4.5.4 透明处理  
    4.5.4.1 决定图形透明性质的基本对象属性  
    4.5.4.2 图形对象透明化机理  
    4.5.4.3 透明化的高层指令及其应用  
    【例4.5.4.3-1】本例演示:最简便的透明化处理,即只要一条简单的指令就可以控制所画曲面的透明度。此时,曲面各点的透明度都相同。在本例中,当aa接近于0时,曲面的透明度高;aa接近于1时,曲面几乎不透明。   
      [X,Y,Z]=peaks(20);  
    surf(X,Y,Z);  
    shading flat  
    aa=0.5;  
    alpha(aa)    
       
    【例4.5.4.3-2】本例演示:(A)控制透明度在一个轴维方向(如x轴方向)上线性变化的简单方法;(B)由于本例使用的是缺省透明度表(上斜线型),所以x值较小处透明度高,而值较大处几乎不透明。(C)假若在本例所列指令中,再加入透明度表设置指令,如alphamap(’vup’)等,则就可实现较复杂的透明度表现。  
    [X,Y,Z]=peaks(20);  
    surf(X,Y,Z);  
    shading flat  
    options=’x’;  
    alpha(options)  
    xlabel(’x  ightarrow’)    

    【例4.5.4.3-3】本例目的:(A)理解贴片和边的透明度:本例使曲面上不同贴片(和边)取不同的透明度,每个贴片(和边)上各点的透明度相同。(B)指令搭配:只有当待透明化数据是"非标量"时,才能使用alpha(’flat’)alpha(’interp’)。本例时由alpha(Z)把待透明化数据设置为矩阵的。(C)如何查询AlimAlimMode属性。  
    [X,Y,Z]=peaks(20);  
    surf(X,Y,Z);  
    shading flat  
    alpha(Z)  
    alpha(’flat’)  
    Alimit=alim  
    alim_mode=alim(’mode’)    
    Alimit =  
       -6.3605    7.5561  
    alim_mode =  
    auto  

    【例4.5.4.3-4】借助Alpha轴上下限设置改变曲面透明度。本例演示:指令alpha(options)是如何随输入宗量options的不同,而对不同的对象属性进行设置。  
    [X,Y,Z]=peaks(20);  
    surf(X,Y,Z);  
    shading  flat  
    alpha(Z)  
    Amin=-3;Amax=3;  
    alim([Amin,Amax])  
    alpha(’scaled’)  
    alpha(’interp’)  

    【例4.5.4.3-5】借助MATLAB提供的透明度表,设置曲面的透明度。本例演示:(AV字型透明表:表有64个元素;第1和第64个元素透明度为1,即不透明;第32个元素透明度为0,即全透明。(B)待透明化数据是Z阵中大小不同的元素,因此纵坐标为0附近的曲面部分将几乎全透明,而上下峰几乎完全不透明。  
    clf,figure  
    [X,Y,Z]=peaks(20);  
    surf(X,Y,Z);  
    shading interp  
    alpha(Z)  
    alpha(’interp’)  
    alphamap(’vdown’)    
      
    【例4.5.4.3-6】用透明度和色彩同时表现曲面的径向导数:导数大处颜色深、欠透明;导数小处颜色浅、较透明。注意AlphaData设置与Cdata的搭配。  
    figure(close)  
    x=3*pi*(-1:1/30:1);y=x;[X,Y]=meshgrid(x,y);  
    R=sqrt(X.^2+Y.^2)+eps;Z=sin(R)./R;  
    [dzdx,dzdy]=gradient(Z);  
    dzdr=sqrt(dzdx.^2+dzdy.^2);  
    surf(X,Y,Z,abs(dzdr))  
    shading interp  
    colormap(spring)  
    alphamap(’rampup’)  
    alpha(’color’)  
    alpha(’interp’)  

    4.6.1 图象的类别和显示  
    4.6.2 图象的读写  
    4.6.2.1 图象数据的保存和提取  
    4.6.2.2 标准格式图象文件的读写  
    【例4.6.2.2-1】图象文件的读取和图象的显示  
    1  
    [X,cmap]=imread(’trees.tif’);  
    class(X)  
    image(X);colormap(cmap);axis image off   
    ans =  
    uint8    

    2  
    [X,cmap]=imread(’saturn.tif’);  
    cmap  
    imagesc(X);  
    colormap(gray);  
    axis image off    
    cmap =  
         []    

    3  
    X=imread(’flowers.tif’);  
    imwrite(X,’ff.jpg’,’Quality’,100)  
    imfinfo(’ff.jpg’)  
    image(imread(’ff.jpg’))  
    axis image off    
    ans =  
    Filename: ’ff.jpg’  
    FileModDate: ’03-Mar-2002 13:42:30’  
    FileSize: 193220  
    Format: ’jpg’  
    FormatVersion: ’’  
    Width: 500  
    Height: 362  
    BitDepth: 24  
    ColorType: ’truecolor’  
    FormatSignature: ’’  

    4.6.3 8位和16位图象  
     【例4.6.3.1-1】变址图象两种数据类型的转换。本例演示:(A)由位深度(BitDepth)可知存放图象数据的类型;(B)存放同一图象的unit8类数据和double类数据间的等价转换;(C)利用imwrite生成图象格式文件时默认地采用unit8类型存放图象数据。  
      
      1  
    imageinf=imfinfo(’forest.tif’)    
    imageinf =  
    Filename: ’E:MATLAB6P1 oolboximagesimdemosforest.tif’  
    FileModDate: ’26-Oct-1996 06:11:14’  
    FileSize: 124888  
    Format: ’tif’  
    …………  
    BitDepth: 8  
    …………  
    Colormap: [256x3 double]  
    …………  
    2  
    [X8,cmap]=imread(’forest.tif’);  
    subplot(1,2,1);  
    image(X);colormap(cmap);axis image off  
    X64=double(X8)+1;subplot(1,2,2);  
    image(X64);colormap(cmap);axis image off    
      
    3  
    whos    
      Name           Size           Bytes  Class  
      X8           301x447         134547  uint8 array  
      X64          301x447        1076376  double array  
      cmap         256x3             6144  double array  
      imageinf       1x1            11250  struct array  
    Grand total is 271910 elements using 1239567 bytes    
    4  
    imwrite(X64,cmap,’myforest.jpg’)  
    imfinfo(’myforest.jpg’)    
    ans =   
    Filename: ’myforest.jpg’  
    FileModDate: ’03-Mar-2002 19:38:26’  
    FileSize: 27716  
    Format: ’jpg’  
    FormatVersion: ’’  
    Width: 447  
    Height: 301  
    BitDepth: 24  
    ColorType: ’truecolor’  
    FormatSignature: ’’  

    4.6.4 捕获图形生成图象文件  
    【例4.6.4-1】本例目的:(1)加深对getframe获取图形构架数据的理解。(2)比较原图和再生图,可以发现差异。(请读者在指令窗中,运行以下指令)  
    figure(2);surf(peaks)  
    f=getframe(2);  
    figure(1)  
    image(f.cdata);colormap(f.colormap)  
    【例4.6.4-2】本例目的:(A)任何图形在getframe作用下都可成为图象。(B)比较原图和再生图,可以发现差异。(请读者在指令窗中,运行以下指令)  
    figure(2),surf(peaks),[X,cmap]=getframe(2);  
    imwrite(X,cmap,’fff.tif’);figure(1);image(imread(’fff.tif’)) 

    4.7.1 图形窗菜单和工具条简介  
    【例4.7.1-1】运行以下指令产生如图4.7-1所示的图形窗。  
    clf;shg,t=(pi*(0:1000)/1000)’;y1=sin(t);y12=sin(t).*sin(10*t);  
    plot(t,y12,’b-’,t,[y1,-y1],’r:’),axis([0,pi,-1,1])    

    4.8.1 一元函数简捷绘图指令  
    【例4.8.1-1】绘制 和它的积分  间的图形。  
    syms t tao;  
    y=2/3*exp(-t/2)*cos(sqrt(3)/2*t);  
    s=subs(int(y,t,0,tao),tao,t);  
    subplot(1,2,1),ezplot(y,[0,4*pi]);grid  
    subplot(1,2,2),ezplot(s,[0,4*pi]);grid  
    title(’s = inty(t)dt’)  

    4.8.2 二元函数简捷绘图指令  
    【例4.8.2-1】在园域上画 的图形。(图4.8-2  
    ezsurf(’x*y’,’circ’);shading flat;view([-18,28])    

    【例4.8.2-2】使用球坐标参量画部分球壳。(图4.8-3  
    x=’cos(s)*cos(t)’;y=’cos(s)*sin(t)’;z=’sin(s)’;  
    ezsurf(x,y,z,[0,pi/2,0,3*pi/2])  
    view(17,40);shading interp;colormap(spring)  
    light(’position’,[0,0,-10],’style’,’local’)  
    light(’position’,[-1,-0.5,2],’style’,’local’)  
    material([0.5,0.5,0.5,10,0.3])



    http://blog.sciencenet.cn/blog-112365-410575.html 

  • 相关阅读:
    css浏览器兼容问题集锦
    【转】H264编码原理以及I帧B帧P帧
    Makefile Shell 脚本;sed命令
    oProfile 学习
    C++ 局部变量的析构
    【转】C++ 单例模式
    C++ operator 知识点 2
    C++ operator 知识点
    218多校第九场 HDU 6424 (数学)
    2018多校第九场 HDU 6416 (DP+前缀和优化)
  • 原文地址:https://www.cnblogs.com/Reallylzl/p/5905071.html
Copyright © 2020-2023  润新知