详解MATLAB图像函数及其应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1 MATLAB二维图形绘制

二维图形绘制是图形绘制中最常用的,它常应用于显示两组数据之间的关系。二维图形绘制是复杂图形绘制的基础,包括绘制普通二维图形和特殊二维图形,如直方图、阶梯图、圆饼图、罗盘图、极坐标图等。

2.1.1 plot——绘制二维平面图

【功能】 绘制线性二维图。当线条多于一条时,若用户没有指定线条的颜色,则 plot循环使用由当前坐标轴颜色顺序属性定义的颜色,以区别不同的线条。

【语法介绍】

● plot(X,Y) 绘制Y对于X(即以X为横轴)的二维图形。当X、Y均为实数同维向量时,则plot(X,Y)描出点(X(i),Y(i)),然后用直线依次相连;当X、Y均为复数向量时,不考虑虚数部分。若X或Y是一个矩阵时,则该矩阵的行或列的向量将被绘制。

● plot(Y) 绘制对Y索引(Y的数据点数)的图形。若Y为实数向量,维数为n,则plot(Y)等价于plot(1:n,Y);若Y为复数向量,则plot(Y)等价于plot(real(Y),imag(Y)),其中,real(Y)和imag(Y)分别代表向量Y的实部向量和虚部向量;若Y为实数矩阵,行数为n,则plot(Y)等价于plot(1:n,Y)。

● plot(X,Y,S) 绘制字符串参量S指定的类型、样式和颜色的线条。字符串参量S的取值参见表2.1。其他参量及意义同上。

表2.1 绘图线条的颜色、样式、类型

● plot(X1,Y1,X2,Y2,…) 在同一幅图上绘制多条曲线,Xi与Yi成对出现,每一条曲线分别由(Xi,Yi)定义。

● plot(…,'propertyname','propertyvalue',…) 绘制二维平面图,并设置图形中线性对象属性propertyname的值为propertyvalue。字符串参量propertyname取值为LineWidth(线的宽度,其值为标量)、MarkerEdgeColor(标记点符号颜色,其值参见表2.1)、MarkerFaceColor(标记点符号填充颜色,其值参见表2.1)、MarkerSize(标记点符号大小,其值为标量)。

【实例1】 绘制正弦曲线,曲线设置为红色,并且添加网格。

        >> X=0:pi/10:2*pi;
        Y=sin(X);                   %创建正弦曲线
        plot(X,Y,'r');              %用红色绘制曲线,如图2.1所示
        grid minor;                 %添加网格

图2.1 绘制正弦曲线并添加网格

【实例2】 绘制正弦曲线簇,并且返回曲线句柄。

        >> %创建正弦曲线簇
        X=0:pi/10:2*pi;
        X1=X;
        Y1=sin(X+1/5*pi);
        X2=X;
        Y2=sin(X+2/5*pi);
        X3=X;
        Y3=sin(X+3/5*pi);
        X4=X;
        Y4=sin(X+4/5*pi);
        X5=X;
        Y5=sin(X+pi);
        %绘制正弦曲线簇,如图2.2所示
        h=plot(X1,Y1,X2,Y2,X3,Y3,X4,Y4,X5,Y5)

        运行结果:
        h=

          172.1709
          173.1704
          174.1704
          175.1704
          176.1704

图2.2 绘制正弦曲线簇并返回曲线句柄

【实例3】 绘制曲线,并指定曲线的图形属性。

        >> x = -pi:pi/10:pi;
        y=tan(sin(x))-sin(tan(x));                          %创建曲线
        plot(x,y,'--rs','LineWidth',2,...                   %绘制曲线,指定线宽
                      'MarkerEdgeColor','k',...             %指定记号点边缘颜色
                      'MarkerFaceColor','g',...             %指定记号点填色
                      'MarkerSize',10)                      %指定记号点大小,如图2.3所示

图2.3 绘制曲线并指定曲线的图形属性

【实例4】 绘制正弦曲线,并且指定x轴和y轴的标注。

        >> %绘制正弦曲线,如图2.4所示
        x = -pi:.1:pi;

图2.4 绘制正弦曲线,并且指定x轴和y轴的标注

        y = sin(x);
        plot(x,y)
        %指定x轴和y轴的标注
        set(gca,'XTick',-pi:pi/2:pi)
        set(gca,'XTickLabel',{'-pi','-pi/2','0','pi/2','pi'})

【实例5】 绘制正弦曲线,并且添加标题、曲线说明等标注。

            >> %绘制正弦曲线,如图2.5所示
            x = -pi:.1:pi;
            y = sin(x);
            plot(x,y)
            %指定x轴和y轴的标注
            set(gca,'XTick',-pi:pi/2:pi)
            set(gca,'XTickLabel',{'-pi','-pi/2','0','pi/2','pi'})
            %添加x轴、y轴说明
            xlabel('-\pi \leq \Theta \leq \pi')
            ylabel('sin(\Theta)')
            %添加标题
            title('Plot of sin(\Theta)')
            %添加曲线说明
            text(-pi/4,sin(-pi/4),'\leftarrow sin(-\pi\div4)',...
                'HorizontalAlignment','left')
            %设置线型,包括字体颜色、字体宽度
            set(findobj(gca,'Type','line','Color',[0 0 1]),...
                'Color','red',...
                'LineWidth',2)

图2.5 绘制正弦曲线,并且添加标题、曲线说明等标注

2.1.2 figure——创建图形窗口

【功能】 创建新的图形对象,在屏幕上单独显示的窗口,且窗口中可以输出图形。

【语法介绍】

● figure 创建一个图形窗口并返回它的句柄。

● figure(H) 创建一个句柄为H的图形窗口。若句柄为H的窗口已存在,则使其成为当前窗口,位于所有窗口最上端,并处于可使用状态。

● h=figure(...) 返回图形对象的句柄给h。

【实例1】 创建一个图形窗口,并返回图形句柄。

        >>h=figure                    %创建一个图形窗口,如图2.6所示

        运行结果:
        h=


            1

图2.6 创建图形窗口

【实例2 创建一个图形窗口并且设置窗口的位置和大小。

        >> %获取屏幕大小
        scrsz = get(0,'ScreenSize');
        %显示图形窗口至屏幕左上角,高度和宽度均为屏幕的1/2,如图2.7所示
        figure('Position',[1 scrsz(4)/2 scrsz(3)/2 scrsz(4)/2])

图2.7 创建一个图形窗口并且设置窗口的位置和大小

2.1.3 subplot——分区绘图

【功能】 将当前图形窗口分为m×n个绘图区,即每行n个,共m行,区号按行优先编号,且选定第p个区为当前活动区。

【语法介绍】

● subplot(m,n,p)或subplot(mnp) 将当前窗口划分成m×n个小窗口,并选择第p个小窗口为当前绘图窗口。其中,小窗口的计数顺序是沿着顶部的行由左向右进行,然后再到下一行。

● subplot('posotion',[left bottom width height]) 在指定位置上创建一个窗口。向量参量[left bottom width height]表示窗口的具体位置和大小,其中,[left bottom]指定窗口左下端点的坐标,width和height指定窗口的宽度和高度。若subplot欲创建的小窗口已存在,则删除已存在的小窗口并重新建立新的小窗口。

【实例1】 在同一图形窗口中分区绘制Income曲线(上方)和Outgo曲线(下方),如图2.8所示。

            >> %创建曲线
            income = [3.2 4.1 5.0 5.6];
            outgo = [2.5 4.0 3.35 4.9];
            %在第1个窗口绘制曲线income
            subplot(2,1,1);
            plot(income)
            title('Income')
            %在第2个窗口绘制曲线outgo
            subplot(2,1,2);
            plot(outgo)
            title('Outgo')

图2.8 在同一个图形窗口中分区绘图

【实例2】 在多个窗口绘制一个图形。

        >> %创建曲线
        line1= [3.2 4.1 5.0 5.6];
        line2 = [2.5 4.0 3.35 4.9];
        line3=sin(0:pi/10:pi);
        %在第1、第3个窗口绘制曲线line1,如图2.9所示
        subplot(2,2,[1 3])
        plot(line1)
        %在第2个窗口绘制曲线line2
        subplot(2,2,2)
        plot(line2)
        %在第4个窗口绘制曲线line3
        subplot(2,2,4)
        plot(line3)

图2.9 在多个窗口绘制一个图形

【实例3】 在多个窗口绘制一个图形,注意当指定的窗口不连通时的处理。

        >> %创建曲线
        line1= [3.2 4.1 5.0 5.6];
        line2 = [2.5 4.0 3.35 4.9];
        line3=sin(0:pi/10:pi);
        %在第2、3、5、6个窗口绘制曲线linel,如图2.10所示。由于第2~第6窗口不连通,未包括
          第4个窗口
        subplot(2,3,[2 6])
        plot(line1)
        %在第1个窗口绘制曲线line2
        subplot(2,3,1)
        plot(line2)
        %在第4个窗口绘制曲线line3
        subplot(2,3,4)
        plot(line3)

图2.10 在多个窗口且窗口不连通时绘制一个图形

【实例4】 当在一个图形窗口分区显示很多图形时,默认显示的坐标轴刻度就会发生阻塞或导致崩溃。

            >> figure
            for i=1:12
                subplot(12,1,i)
                plot(sin(1:100)*10^(i-1))            %坐标轴刻度崩溃,如图2.11所示
            end

图2.11 一个窗口分区显示很多图像时,默认显示的坐标轴出现崩溃

解决的方法:一是增大图形窗口,给坐标轴刻度的显示创建足够的空间;二是消除x轴刻度和y轴刻度,只对一条轴进行刻度显示,如实例5。

【实例5】 消除x轴刻度和y轴刻度,只对一条轴进行刻度显示。

            >> %绘制多个正弦曲线图形
            figure
            for i=1:12
                subplot(12,1,i)
                plot (sin(1:100)*10^(i-1))
                set(gca,'xtick',[],'ytick',[])
            end
            % 重新设置底部的坐标刻度,如图2.12所示
            set(gca,'xtickMode','auto')

图2.12 一个窗口分区显示很多图像时,只对一条轴进行刻度显示

2.1.4 set——设置图像属性

【功能】 修改和设定句柄图形对象。

【语法介绍】

● set(H,'PropertyName',PropertyValue) 设置句柄为 H 的图形对象指定属性 PropertyName的值PropertyValue。

● set(H,a) 设置句柄为H的图形对象的属性值。参量a是一个包含指定对象属性名及属性值的结构。

● set(H,pn,pv) 对多个图像对象指定多个属性值。参量H为包含多个图像对象句柄的向量。pn表示所要设置的n个元素属性名向量。pv表示多个图像对象n个属性对应的属性值,是一个length(H) ×n矩阵,其中,length(H)表示向量H的长度。

● set(H,'PropertyName1',PropertyValue1,'PropertyName2',PropertyValue2,…) 设置句柄为 H 的图形对象的多个属性 PropertyName1,PropertyName2,…的对应属性值PropertyValue1,PropertyValue2,…。

● A=set(H,'PropertyName')或 set(H,'PropertyName') 返回句柄为 H 的图形对象的指定属性PropertyName的值给A。如果该属性没有设置属性值,则A为一个空向量。

● A=set(H)或set(H) 返回句柄为H的图形对象的所有属性和属性值给变量A。

【实例1】 创建图形窗口,返回属性设置,将窗口颜色改为蓝色。

            >>H=figure                %创建图形窗口
            set(H);                    %返回属性设置
            set(H,'color','b')              %将窗口颜色改为蓝色,如图2.13所示

            运行结果:
            H=


                1

                Alphamap
                CloseRequestFcn: string -or- function handle -or- cell array
                Color
                Colormap
                CurrentAxes
                CurrentCharacter
                CurrentObject
                CurrentPoint
                DockControls: [ {on} | off ]
                DoubleBuffer: [ {on} | off ]
                FileName
                IntegerHandle: [ {on} | off ]
                InvertHardcopy: [ {on} | off ]
                KeyPressFcn: string -or- function handle -or- cell array
                KeyReleaseFcn: string -or- function handle -or- cell array
                MenuBar: [ none | {figure} ]
                MinColormap
                …
                …
                …
                Selected: [ on | off ]
                SelectionHighlight: [ {on} | off ]
                Tag
                UIContextMenu
                UserData
                Visible: [ {on} | off ]

图2.13 创建图形窗口并进行颜色设置

【实例2】 绘制peaks函数,将所有曲线变为黑色。

            >> plot(peaks)
            set(findobj('Type','line'),'Color','k')         %所有曲线变为黑色,如图2.14所示

图2.14 绘制peaks函数,改变曲线颜色

2.1.5 axis——设置坐标轴

【功能】 对坐标轴进行标定。

【语法介绍】

● axis([xmin xmax ymin ymax]) 对当前二维图形对象的x与y轴进行标定。向量参量[xmin xmax ymin ymax]中的元素分别表示x轴最小值、x轴最大值、y轴最小值和y轴最大值。

● axis([xmin xmax ymin ymax zmin zmax cmin cmax]) 对当前三维图形对象的x、y与z轴和颜色坐标轴进行标定。向量参量[xmin xmax ymin ymax zmin zmax cmin cmax]中的元素分别表示x轴最小值、x轴最大值、y轴最小值、y轴最大值、z轴最小值、z轴最大值、颜色轴最小值和颜色轴最大值。

● v=axis 返回当前坐标轴的标定属性。v是一个行向量,其元素表示x轴和y轴和z轴(三维时)的最大值、最小值。如果当前图形对象是二维图形,则 v 为四元素向量;如果当前图形对象是三维图形,则v为六元素向量。

● axis auto 根据待绘图数据x、y、z的最大值、最小值自动标定坐标轴。

● axis manual或axis(axis) 锁定当前坐标轴的标定。如果在同一图形窗口绘制图像,则坐标轴标定不会改变。

● axis tight 设置坐标轴的最大值、最小值为数据的范围。

● axis ij 将坐标系统的原点设置在左上角,即纵轴从上到下依次增加,横轴从左到右依次增加。

● axis xy 将坐标系统的原点设置为默认的方式,即原点设置在左下角,纵轴从下到上依次增加,横轴从左到右依次增加。

● axis equal 坐标轴的单位长度相同。

● axis image 同axis equal,只是绘图区域与数据一致。

● axis square 图框呈方形。

● axis off 清除坐标刻度。

● axis on 显示坐标刻度。

● axis(axes_handles,...) 应用坐标轴标定到句柄为axes_handles的轴。

● [mode,visibility,direction]=axis('state') 返回当前坐标轴的指定属性的值。字符串参量state取值可参见表2.2。

表2.2 坐标轴属性表

【实例1】 绘制正切曲线,改变坐标轴的标定。

        >> %绘制正切曲线,如图2.15所示
        x = 0:.025:pi/2;
        plot(x,tan(x),'-ro')
        >> %改变坐标轴的标定,如图2.16所示
        axis([0  pi/2  0  5])

图2.15 绘制正切曲线

图2.16 改变图2.15正切曲线坐标轴的标定

【实例2】 分区绘制图形,并且将两个图形的坐标轴都设置为方形。

        >>h1=subplot(221);              %分区绘图,如图2.17所示
        h2 = subplot(222);
        axis([h1 h2],'square')          %将两个图形的坐标轴都设置为方形

图2.17 分区绘制图形并将两个图形的坐标轴都设置为方形

【实例3】 锁定坐标轴的用法。

        >>figure;                  %创建图形窗口
        axis on;                   %显示坐标轴
        x=0:pi/20:pi;
        y=sin(x);
        plot(x,y);                  %绘制正弦曲线
        axis([0,4,0,3]);            %锁定坐标轴,如图2.18所示
        axis manual;                %锁定坐标轴
        hold on;
        plot(x*2,y*2);
        >>axis auto;                %自动锁定坐标轴,如图2.19所示

图2.18 锁定坐标轴

图2.19 自动锁定坐标轴

2.1.6 xlabel/ylabel/zlabel——添加坐标轴标注

【功能】 添加坐标轴标注。

【语法介绍】

● xlabel('string') 给当前坐标轴的x轴增加文本标注string,参量string为字符串。

● xlabel(...,'PropertyName',PropertyValue,...) 设置当前坐标轴的 x 轴文本标注的属性PropertyName的值PropertyValue。

● xlabel(axes_handle,...),ylabel(axes_handle,...) 和 zlabel(axes_handle,...) 给 句 柄 为axes_handle的轴进行标注。

● h=xlabel/ylabel/zlabel (...) 返回轴上用作标注的文本对象的句柄给h。

【实例1】 给x轴标注。

            >>figure;                                      %新建图形窗口
            xlabel({'first line';'second line'})           %给x轴添加标注,如图2.20所示

图2.20 给x轴添加标注

【实例2】 给y轴标注,并且设置标注属性。

            >>figure;                          %新建图形窗口
            %给y轴标注,并且设置标注属性George''s Popularity,如图2.21所示
            ylabel('George''s Popularity','fontsize',12,'fontweight','b')

图2.21 给y轴标注并设置标注属性

2.1.7 title——添加图名

【功能】 为图形添加图名。

【语法介绍】

● title('text') 在当前坐标轴上方正中央处放置字符串text作为图名。

● title(fname) 先执行能返回字符串的函数fname,然后在当前轴上方正中央处放置返回的字符串作为图名。

● title('text','Property1',PropertyValue1,'Property2',PropertyValue2,…) 在当前坐标轴上方正中央处放置字符串 text 作为图名,并设置 text 图形对象的属性Property1,Property2,…对应的属性值为PropertyValue1,PropertyValue2,…。

● title(axes_handle,...) 给句柄为axes_handle的轴添加图名。

● H=title(…) 返回作为图名的对象的句柄给变量H。

【实例1】 给当前轴添加日期。

            >>title(date)         %添加当前日期至图顶端,如图2.22所示

图2.22 给当前轴添加日期

【实例2】 在标题中包含变量。

            >> f = 70;
            c = (f-32)/1.8;
            title(['Temperature is',num2str(c),'C'])   %添加标题至图顶端,如图2.23所示

图2.23 添加的标题中包含变量

【实例3】 在标题中包含多层标题。

     >> title({'First line';'Second line'})     %添加多层标题至图顶端,如图2.24所示

图2.24 添加的标题中包含多层标题

2.1.8 legend——添加图例

【功能】 给曲线和图形添加图例,用户可以通过移动鼠标,将图例放置在所需位置。

【语法介绍】

● legend('string1','string2',...) 在当前图形窗口中添加图例。字符串参量string1,string2,…表示图例标签。

● legend(h,'string1','string2',...) 在句柄向量为h的多个图形中分别加入图例,并以给定的字符串string1,string2,…作为图例标签。

● legend(M) 在当前图形窗口中添加图例,图例标签由矩阵或细胞矩阵M指定。

● legend(h,M) 在句柄向量为 h 的多个图形中加入图例,图例标签由矩阵或细胞矩阵M指定。

● legend(M,'parameter_name','parameter_value',...) 在当前图形窗口中添加图例,图例标签由矩阵或细胞矩阵 M 指定,并且设置图例的属性 parameter_name 的值parameter_value。

● legend(h,M,'parameter_name','parameter_value',...) 在句柄向量为h的多个图形中加入图例,图例标签由M 矩阵或细胞矩阵指定,并且设置图例的属性parameter_name 的值parameter_value。

● legend(axes_handle,...) 在句柄为axes_handle的轴上添加图例。

● legend('off') 撤销当前图形窗口中的图例。

● legend(axes_handle,'off') 撤销句柄为axes_handle的轴上的图例。

● legend('toggle') 给当前轴设置图例开或关,如果当前轴没有图例,则使用默认的字符串创建图例。

● legend(axes_handle,'toggle') 在句柄为axes_handle的轴上设置图例开或关,如果当前轴没有图例,则使用默认的字符串创建图例。

● legend('hide') 隐藏当前轴的图例。

● legend(axes_handle,'hide') 隐藏句柄为axes_handle的轴的图例。

● legend('show') 显示当前轴的图例。

● legend(axes_handle,'show') 显示句柄为axes_handle的轴的图例。

● legend('boxoff') 去除当前轴的图例的边框。

● legend(axes_handle,'boxoff') 去除句柄为axes_handle的轴的图例的边框。

● legend('boxon') 给当前轴的图例添加边框。

● legend(axes_handle,'boxon') 给句柄为axes_handle的轴的图例添加边框。

● legend_handle=legend(...) 返回当前轴的图例句柄,如果当前轴没有图例,则返回空矩阵。

● legend 更新当前图形窗口的所有图例。

● legend(legend_handle) 更新句柄为axes_handle的轴的图例。

● legend(...,'Location',location) 设置图例在轴上的位置。参量location为四元向量向量[left bottom width height],或者是位置字符串中的一个,具体意义参见表2.3。

表2.3 位置字符串表

【实例1】 给正弦曲线和余弦曲线添加图例。

        >> x = -pi:pi/20:pi;
        plot(x,cos(x),'-ro',x,sin(x),'-.b')       %绘制曲线
        h=legend('cos_x','sin_x',2);              %添加图例,如图2.25所示
        set(h,'Interpreter','none')               %设置属性

图2.25 添加图例

【实例2】 给正弦曲线和余弦曲线添加图例,图例字符串由M给出。

        >> x = -pi:pi/20:pi;
        plot(x,cos(x),'-ro',x,sin(x),'-.b')        %绘制曲线
        M={'cos_x','sin_x'};
        h=legend(M);                               %添加图例,如图2.26所示

图2.26 添加由指定字符串给出的图例

【实例3】 添加图例并返回句柄,去除图例的边框。

        >> x = -pi:pi/20:pi;
        plot(x,cos(x),'-ro',x,sin(x),'-.b')                %绘制曲线
        h=legend('cos_x','sin_x',2)                  %添加图例并返回句柄,如图2.27所示

        运行结果:
        h=

          178.0121
        >>legend('boxoff')                       %去除图例的边框,如图2.28所示

图2.27 添加图例并返回句柄

图2.28 去除图例的边框

【实例4】 添加图例,改变图例的位置。

        >> x = -pi:pi/20:pi;
        plot(x,cos(x),'-ro',x,sin(x),'-.b')                %绘制曲线
        h=legend('cos_x','sin_x');                         %添加图例,如图2.29所示
        >>legend('Location','NorthEastOutside');           %改变图例的位置,如图2.30所示

图2.29 添加图例

图2.30 改变图2.29图例的位置

2.1.9 hold——图形保持

【功能】 使用hold函数后,在已存在图形窗口中使用plot函数继续添加新的图形内容。使用hold on后,再执行plot函数,在保持原有图形或曲线的基础上,添加新绘制的图形。

【语法介绍】

● hold on 保留当前图形与当前坐标轴的属性值,后面的图形命令只能在当前存在的坐标轴或图形中执行。

● hold off 删除前面的图形,返回到默认状态,在画新图形之前,重新设置坐标轴的属性为默认值。

● hold all 保留当前图形与当前坐标轴的所有属性值,包括曲线的颜色和类型,后面的图形命令只能在当前存在的坐标轴中增加图形。

● hold 在hold on和hold off之间切换。

● hold(axes_handle,...) 使hold对句柄为axes_handle的轴起作用。

【实例】 绘制正弦曲线,应用hold绘制余弦曲线。

            >> x = -pi:pi/20:pi;
            plot(x,sin(x),'-.b')            %绘制正弦曲线
            hold on;                        %保留当前图形
            plot(x,cos(x),'-ro')            %绘制余弦曲线,如图2.31所示
            >>hold off                      %删除前面的图形,返回到默认状态
            plot(x,cos(x),'-ro')            %绘制余弦曲线,如图2.32所示

图2.31 使用hold on函数绘制的曲线图

图2.32 继续使用hold off函数绘制的曲线图

2.1.10 ginput——获取指定点坐标值

【功能】 使用鼠标获取指定点的坐标值。

【语法介绍】

● [x,y]=ginput(n) 用鼠标在当前的坐标图上选择n个点,通过鼠标或键盘获取这n个点的相应坐标向量x和y。用户可以在输入n个点之前单击“回车键”终止输入。

● [x,y]=ginput 用鼠标在当前的坐标图上选择任意个点,通过鼠标或键盘获取这些点的相应坐标向量x和y。

● [x,y,button]=ginput(n) 用鼠标在当前的坐标系上选择n个点,通过鼠标或键盘获取这n个点的相应坐标向量x,y和标示向量button。其中,button值分别表示用户单击的鼠标键值(鼠标左、中、右键分别为数值 1,2,3),或用户在键盘上单击的键值,即ASCII码值。

【实例】 从坐标图上选择5个点。

        >> figure;
        [x,y]=ginput(5)                 %用鼠标选择5个点,如图2.33所示

        运行结果:
        x=


            0.2224
            0.5933
            0.7684
            0.4689
            0.4251

        y=


              0.8728
              0.3289
              0.6944
              0.5921
              0.3173

图2.33 从坐标图上选择5个点

2.1.11 semilogx/semilogy——设置x/y轴单对数坐标轴

【功能】 绘制 x 或 y 轴的对数图形。若没有指定使用的颜色,当所画线条较多时, semilogx/semilogy将自动使用由当前轴的ColorOrder和LineStyleOrder属性指定的颜色顺序和线型顺序来画线。

【语法介绍】 对x轴使用对数刻度(以10为底),y轴使用线性刻度,再进行plot函数绘图。此时功能相当于2.1.1节的plot函数。

● semilogx(Y)

● semilogx(X1,Y1,X2,Y2,…)

● semilogx(X1,Y1,LineSpec1X2,Y2,LineSpec2,…)

● semilogx(…,'PropertyName',PropertyValue,…)

【实例1】 设置y轴为单对数坐标轴。

            >> x = 0:.1:10;
            plot(x,cos(x));               %一般情况下绘制余弦曲线,如图2.34所示
            >>semilogy(x)              %设置y轴为单对数坐标轴,如图2.35所示

图2.34 绘制余弦曲线

图2.35 设置y轴为单对数坐标轴

【实例2】 设置y轴为单对数坐标轴,绘制指数曲线簇。

            >>%创建指数曲线簇
            X=0:pi/10:2*pi;
            X1=X;
            Y1=exp(X+1/5*pi);
            X2=X;
            Y2=exp(X+2/5*pi);
            %在正常坐标轴下绘制指数曲线簇,如图2.36所示
            plot(X1,Y1,X2,Y2);
            %设置y轴为单对数坐标轴,绘制指数曲线簇,如图2.37所示
            figure;
            semilogy (X1,Y1,X2,Y2);

图2.36 正常坐标下绘制指数曲线簇

图2.37 设置y轴为单对数坐标轴,绘制图2.36指数曲线簇

2.1.12 loglog——设置双对数坐标

【功能】 设置双对数坐标。

【语法介绍】 对x和y轴都使用对数刻度(以10为底),再进行plot函数绘图。此时功能相当于2.1.1节plot函数。

● semilogx(Y)

● semilogx(X1,Y1,X2,Y2,…)

● semilogx(X1,Y1,LineSpec1,X2,Y2,LineSpec2,…)

● semilogx(…,'PropertyName',PropertyValue,…)

【实例】 设置双对数坐标。

            >>x=logspace(-1,2);              %创建对数向量
            loglog(x,exp(x),'-s')            %设置双对数坐标
            grid on                          %添加网格,如图2.38所示

图2.38 设置双对数坐标并添加网络

2.1.13 fill——图形填充

【功能】 用颜色填充二维多边形。

【语法介绍】

● fill(X,Y,ColorSpec) 使用参量ColorSpec指定的颜色填充由向量X和Y定义的多边形。参量ColorSpec可为RGB向量、字符或字符串,取值参见表2.4。

● fill(X1,Y1,ColorSpec1,X2,Y2,ColorSpec2,…) 使用参量 ColorSpec1、ColorSpec2,…指定的颜色分别填充的多个二维区域 (X1,Y1),(X2,Y2),…。

● fill(…,'PropertyName',PropertyValue) 对填充图形对象的属性PropertyName设定属性值PropertyValue。PropertyName和PropertyValue的取值参见表1.5。

● h=fill(…) 返回填充图形对象的句柄给向量h,其中,每一个填充对象对应一个句柄。

表2.4 ColorSpec参数表

【实例】 创建一个红色的多边形。

            >> %创建多边形向量
            t = (1/16:1/8:1)'*2*pi;
            x = sin(t);
            y = cos(t);
            %填充多边形,如图2.39所示
            fill(x,y,'r')
            axis square

图2.39 创建一个红色的多边形

2.1.14 bar/barh——条形图

【功能】 绘制二维垂直/水平条形图。用垂直/水平条形显示向量或矩阵中的值。

【语法介绍】

● bar(X,Y) 在指定的横坐标X上画出条形图,其中X为严格单增的向量。若Y为矩阵,则bar函数把Y中的各个行向量在指定的横坐标X处分别画出条形图。

● bar(Y) 等价于bar(1:M,Y),其中,M值为向量Y的元素个数或矩阵Y的列数。

● bar(X,Y,width)或bar(Y,width) 绘制由条形相对宽度为width和控制在一组内条形间距的条形图。width的默认值为0.8。

● bar(…,'style') 绘制由参量 style 指定条形排列类型的条形图。参量 style 取值为grouped(组式,默认显示模式)和stacked(制堆式)。

● bar(…,LineSpec) 使用指定的颜色LineSpec显示所有的条形。LineSpec取值参见表2.1。

● h=bar(…) 返回条形图形对象的句柄给向量h,其中,每一个条形对象对应一个句柄。

【实例1】 绘制二维条形图。

        >> x = -2.9:0.2:2.9;
        bar(x,exp(-x.*x),'r')       %绘制y=exp(-x.*x)的二维条形图,如图2.40所示

图2.40 绘制二维条形图

【实例2】 以不同模式显示条形图。

        >> %创建一个5×3的随机矩阵,矩阵值的范围为[0,10]
        Y = round(rand(5,3)*10);
        %在分区窗口1以'Group'模式显示条形图,如图2.41所示
        subplot(2,2,1)
        bar(Y,'group')
        title 'Group'
        %在分区窗口2以'Stack'模式显示条形图
        subplot(2,2,2)
        bar(Y,'stack')
        title 'Stack'
        %在分区窗口3以'Stack'模式水平显示条形图
        subplot(2,2,3)
        barh(Y,'stack')
        title 'Stack'
        %在分区窗口4以默认模式显示条形图,将条形宽度设为原宽度的1.5倍
        subplot(2,2,4)
        bar(Y,1.5)
        title 'Width = 1.5'

图2.41 以不同模式显示条形图

【实例3】 改变条形图表颜色。

            >> Y = randn(3,5);
            h = bar(Y);
            set(get(h(1),'BaseLine'),'LineWidth',2,'LineStyle',':')
            colormap summer                            %改变条形图表颜色,如图2.42所示

图2.42 改变条形图表颜色

2.1.15 pie——圆饼图

【功能】 画饼形图。

【语法介绍】

● pie(X) 绘制矩阵X中非负数据的饼形图。若X中非负元素和小于1,则pie仅画出部分的饼形图,且非负元素X(i,j)的值直接限定饼形图中扇形的大小;若X中非负元素和大于或等于1,则非负元素X(i,j)代表饼形图中的扇形大小通过X(i,j)/Y的大小来决定,其中,Y为矩阵X中非负元素和。

● pie(X,EXPLODE) 绘制由参量EXPLODE指定拉出扇形的饼形图。参量EXPLODE与X维数相同,EXPLODE中非零元素对应X中元素的扇形块将被拉出。

● pie(axes_handle,...) 在句柄为axes_handle的轴上绘制圆饼图。其他参量及结果同上。

● h=pie(…) 返回图形对象的句柄给向量h。

【实例】 绘制圆饼图。

            >> x = [1 3 0.5 2.5 2];
            explode=[0 1 0 0 0];            %第2块被拉出
            pie(x,explode)                  %绘制圆饼图,如图2.43所示
            colormap jet                    %设置颜色表

图2.43 绘制圆饼图

2.1.16 stairs——阶梯图

【功能】 画二维阶梯图,这种图对与时间有关的数字样本系统的作图很有用处。

【语法介绍】

● stairs(Y) 绘制向量Y中元素的阶梯图。

● stairs(X,Y) 绘制在指定位置X上向量Y中元素的阶梯图。X为向量,其值必须是单调增大且均匀分布的。

● stairs(…,LineSpec) 绘制由参数 LineSpec 指定的线型、标记符号和颜色的阶梯图。参量LineSpec的取值参见表2.1。

● [XX,YY]=stairs(X,Y) 返回可以用plot函数画出向量X,Y的阶梯图的向量XX与YY。注意,该命令不画阶梯图。

● stairs(axes_handle,...) 在句柄为axes_handle的轴上绘制阶梯图。

● H=stairs(X,Y) 绘制在指定位置X上向量Y中元素的阶梯图,并返回线条的句柄给向量H。

【实例】 绘制阶梯图。

            >> x = linspace(-2*pi,2*pi,40);
            stairs(x,sin(x))                  %绘制正弦函数的阶梯图,如图2.44所示

图2.44 绘制阶梯图

2.1.17 hist——直方图

【功能】 二维条形直方图,可显示数据的分配情形。向量y或矩阵Y中的列向量中的元素根据它们的数值范围分组的,每一组作为一个条形进行显示。条形直方图中的x轴反映数据Y中元素数值的范围,y轴显示出参量Y中的元素落入该组的数目。

【语法介绍】

● N=hist(Y) 把向量Y中的元素分给等距分布的10个条形中,且返回每一个条形中的元素个数给向量N。

● N=hist(Y,M) 把向量Y中的元素分给等距分布的M个条形中,且返回每一个条形中的元素个数给向量N。

● N=hist(Y,X) 把向量Y中元素分到由向量X中元素指定中心位置的条形中,且返回每一个条形中的元素个数给向量N。

● [N,xout]=hist(…) 返回块中心的位置给向量xout。

● hist(axes_handle,...) 在句柄为axes_handle的轴上绘制直方图。

● hist(…) 绘制直方图,没有输出。

【实例】 绘制直方图,改变直方图的颜色。

            >> x = -4:0.1:4;
            y = randn(10000,1);
            hist(y,x)               %绘制直方图,如图2.45(a)所示
            >> %改变直方图的颜色为红色,边缘为白色,如图2.45(b)所示
            h = findobj(gca,'Type','patch');
            set(h,'FaceColor','r','EdgeColor','w')

图2.45 绘制直方图并改变颜色

2.1.18 rose——角度直方图

【功能】 绘制角度直方图。该直方图是一个显示所给数据变化范围内数据的分布情形的极坐标图,所给数据分成不同的组。每一组作为一小扇形进行显示。

【语法介绍】

● rose(THETA) 绘制角向量为THETA的直方图,其中THETA中的角度用弧度作单位。

● rose(THETA,N) 使用标量参量N来均匀地划分0到2π,并绘制角向量为THETA的直方图。默认的N为20。

● rose(THETA,X) 使用向量参量X所确定的分块来绘制角向量为THETA的直方图。其中,向量X的长度表示扇形个数,X中的元素表示每个扇形的中线角度。

● rose(axes_handle,...) 在句柄为axes_handle的轴上绘制角度直方图。

● [T,R]=rose(…) 返回两个向量T与R,用于函数polar(T,R)画出极坐标图形。注意,该命令没有画任何图形。

● H=rose(…) 返回句柄向量H。

【实例】 绘制角度直方图。

            >> theta = 2*pi*rand(1,50);
            rose(theta)                 %绘制角度直方图,如图2.46所示

图2.46 绘制角度直方图

2.1.19 stem——离散序列数据杆状图

【功能】 画二维离散数据杆状图。该图用线条显示数据点与x轴的距离,一小圆圈(默认标记)或用指定的其他标记符号与线条相连,在y轴上标记数据点的值。

【语法介绍】

● stem(Y) 绘制向量Y的离散序列数据杆状图。

● stem(X,Y) 在横坐标X上画出列向量Y的数据杆状图。

● stem(…,'fill') 以填充图的方式来绘制序列数据杆状图。

● stem(…,LineSpec) 绘制由参量LineSpec指定线型、标记符号和柄图末端小圆圈颜色的数据杆状图。参量LineSpec的取值参见表2.1。

● stem(axes_handle,...) 在句柄为axes_handle的轴上绘制离散序列数据杆状图。

● H=stem(…) 返回柄形图的图形对象的句柄给向量H。

【实例1】 绘制离散序列数据杆状图,设置基准线的线型和圆圈的颜色。

            >> t = linspace(-2*pi,2*pi,10);
            h=stem(t,cos(t),'fill','--');                   %绘制离散序列数据杆状图,如图2.47所示
            set(get(h,'BaseLine'),'LineStyle',':')          %设置基准线的线型
            set(h,'MarkerFaceColor','red')                  %设置圆圈的颜色

图2.47 绘制离散序列数据杆状图

【实例2】 在同一个图形窗口中绘制两组数据杆状图。

            >> x = 0:25;
            y = [exp(-.07*x).*cos(x);exp(.05*x).*cos(x)]';
            h=stem(x,y);                                          %绘制两种数据杆状图,如图2.48所示
            set(h(1),'MarkerFaceColor','blue')                    %蓝色圆形杆状图
            set(h(2),'MarkerFaceColor','red','Marker','square')   %红色正方形杆状图

图2.48 在同一个图形窗口中绘制两组数据杆状图

2.1.20 errorbar——误差棒形图

【功能】 沿着一曲线绘制误差棒形图。误差棒为数据的置信水平或者为沿着曲线的偏差。

【语法介绍】

● errorbar(Y,E) 绘制向量Y,同时显示Y中每个元素的误差棒。对应Y(i)的误差棒的长度为2*E(i)。

● errorbar(X,Y,L,U) 绘制误差棒形图。参量X,Y,L,U必须为同型向量或矩阵。若同为向量,则在点(X(i),Y(i))处画出向下长为 L(i),向上长为 U(i)的误差棒;若同为矩阵,则在点(X(i,j),Y(i,j))处画出向下长为L(i,j),向上长为U(i,j)的误差棒。

● errorbar(X,Y,E) 等价于errorbar(X,Y,E,E)。

● errorbar(…,LineSpec) 绘制由 LineSpec 指定的线型、标记符、颜色的误差棒形图。参量LineSpec的取值参见表2.1。

● H=errorbar(…) 返回线图形对象的句柄给向量H。

【实例】 绘制误差棒形图。

            >> X = 0:pi/10:pi;
            Y=sin(X);                            %创建正弦函数
            E=std(Y)*ones(size(X));              %计算误差
            errorbar(X,Y,E)                      %绘制误差棒形图,如图2.49所示

图2.49 绘制误差棒形图

2.1.21 compass——罗盘图

【功能】 从原点画箭头图。箭头图为一显示起点为笛卡儿坐标系中的原点的二维或三维方向或向量的图形,同时在坐标系中显示圆形的分隔线。

【语法介绍】

● compass(X,Y) 绘制一个从原点出发、由(X(i),Y(i))组成的向量箭头图形。

● compass(Z) 等价于compass(REAL(Z),IMAG(Z)),其中,REAL(Z)和IMAG(Z)分别表示向量Z的实部向量和虚部向量。

● compass(…,LineSpec) 绘制由参量LineSpec指定箭头图的线型、标记符号、颜色属性的罗盘图。参量LineSpec的取值参见表2.1。

● compass(axes_handle,...) 在句柄为axes_handle的轴上绘制罗盘图。

● H=compass(…) 返回线对象的句柄给H。

【实例】 绘制罗盘图。

        >>Z=eig(randn(20,20));               %创建变量
        compass(Z)                        %绘制罗盘图,如图2.50所示

图2.50 绘制罗盘图

2.1.22 feather——羽毛图(速度向量图)

【功能】 绘制速度向量图,在横坐标上等距地显示指定向量。

【语法介绍】

● feather(U,V) 绘制由向量参量U与V构成的速度向量(U(i),V(i))的羽毛图。

● feather(Z) 等价于feather(REAL(Z),IMAG(Z)),其中,REAL(Z)和IMAG(Z)分别表示向量Z的实部向量和虚部向量。

● feather(…,LineSpec) 绘制由参量LineSpec指定箭头图的线型、标记符号、颜色属性的羽毛图。参量LineSpec的取值参见表2.1。

● feather(axes_handle,...) 在句柄为axes_handle的轴上绘制羽毛图。

● H=feather (…) 返回羽毛图中线型对象的句柄给H。

【实例】 绘制羽毛图。

            >> theta = (-90:10:90)*pi/180;
            r = 2*ones(size(theta));
            [u,v]=pol2cart(theta,r);                %创建变量
            feather(u,v);                           %绘制羽毛图,如图2.51所示

图2.51 绘制羽毛图

2.1.23 polar——极坐标图

【功能】 绘制极坐标图。该命令接受极坐标形式的函数rho=f(θ),在笛卡儿坐标系平面上画出该函数,且在平面上画出极坐标形式的格栅。

【语法介绍】

● polar(THETA,RHO) 绘制指定极角和极径的极坐标图形。参量THETA表从x轴到半径的单位为弧度的极角向量,RHO表示各数据点到极点的极径向量。

● polar(THETA,RHO,LineSpec) 绘制由参量LineSpec指定线条的线型、标记符号和颜色的极坐标图形。参量LineSpec的取值参见表2.1。

● polar(axes_handle,...) 在句柄为axes_handle的轴上绘制极坐标图。

● h=polar(...) 返回极坐标图中线型对象的句柄给h。

【实例】 绘制极坐标图。

            >> t = 0:.01:2*pi;
            polar(t,sin(2*t).*cos(2*t),'--r')            %绘制极坐标图,如图2.52所示

图2.52 绘制极坐标图

2.1.24 zoom——图形缩放

【功能】 对二维图形进行放大或缩小。放大或缩小会改变坐标轴范围。

【语法介绍】

● zoom 确定缩放的状态。

● zoom ON 对当前的图形进行缩放。

● zoom OFF 关闭交互式缩放功能。

● zoom OUT 将图形返回至初始状态。

● zoom RESET 清除放大点。

● zoom XON 只对x轴进行放大。

● zoom YON 只对y轴进行放大。

● zoom(FACTOR) 对当前图形进行factor倍的放大或缩小,而不影响交互式放大的状态。若factor>1,系统将图形放大factor倍;若0<factor≤1,系统将图形放大1/factor倍。

● zoom(FIG,…) 对句柄为FIG的二维图形进行放大。

● h=zoom(figure_handle) 返回句柄为figure_handle的图形窗口的缩放模式对象句柄。

【实例1】 对于当前的图形进行缩放,如图2.53所示。

图2.53 对于当前的图形进行缩放

            >> plot(1:10);
            zoom on

【实例2】 在水平方向缩放图像。

            >> plot(1:10);
             h = zoom;
            set(h,'Motion','horizontal','Enable','on');          %在水平方向缩放图像,如图2.54所示

图2.54 在水平方向缩放图像

【实例3】 在分区窗口中缩放图形。在4个分区窗口中创建图形,通过设置轴句柄属性使每个窗口的缩放模式都不同。

            >> %在分区1绘制图形,获取缩放模式句柄
            ax1 = subplot(2,2,1);
            plot(1:10);
            h = zoom;
            %在分区2绘制图形,设置缩放模式不可用
            ax2 = subplot(2,2,2);
            plot(rand(3));
            setAllowAxesZoom(h,ax2,false);
            %在分区3绘制图形,设置缩放模式为水平模式
            ax3 = subplot(2,2,3);
            plot(peaks);
            setAxesZoomMotion(h,ax3,'horizontal');
            %在分区4绘制图形,设置缩放模式为垂直模式,如图2.55所示
            ax4 = subplot(2,2,4);
            contour(peaks);
            setAxesZoomMotion(h,ax4,'vertical');

图2.55 在分区窗口中缩放图形并使每个窗口的缩放模式都不同

【实例4】 通过函数设置zoom的属性值。复制下列代码在一个新的M文件中,然后执行程序。

            function demo
            % 允许曲线调用函数返回值设置'ButtonDownFcn'属性
            hLine=plot(rand(1,10));                                %创建函数曲线,如图2.56所示
            set(hLine,'ButtonDownFcn','disp(''This executes'')');
            set(hLine,'Tag','DoNotIgnore');                        %设置曲线属性
            h = zoom;
            set(h,'ButtonDownFilter',@mycallback);
            set(h,'Enable','on');                                  %设置缩放属性
            function [flag] = mycallback(obj,event_obj)
            % 如果对象标识为'DoNotIgnore',则返回函数值
            objTag=get(obj,'Tag');                                 %对象属性
            %判断对象标识是否为'DoNotIgnore',返回函数值
            if strcmpi(objTag,'DoNotIgnore')
              flag = true;
            else
              flag = false;
            end

图2.56 通过函数设置zoom的属性值

【实例5】 在zoom操作前和操作后执行函数。复制下列代码在一个新的M文件中,然后执行程序。

            function demo
            % 等待zoom操作事件
            plot(1:10);
            h = zoom;
            set(h,'ActionPreCallback',@myprecallback);      %操作前执行函数
            set(h,'ActionPostCallback',@mypostcallback);     %操作后执行函数,如图2.57所示
            set(h,'Enable','on');

            % zoom操作前执行的函数
            function myprecallback(obj,evd)
            disp('A zoom is about to occur.');

            % zoom操作后执行的函数
            function mypostcallback(obj,evd)
            newLim = get(evd.Axes,'XLim');
            msgbox(sprintf('The new X-Limits are [%.2f %.2f].',newLim));

图2.57 在zoom操作前和操作后执行函数

2.1.25 clf——清除当前图形窗口

【功能】 清除当前图形窗口。该命令在命令窗口中执行与在回调程序中执行效果是一样的,即它不能区别由callback设置的属性HandleVisibility,也就是说,当它从一回调程序中执行时,命令clf仅仅删除属性HandleVisibility为on的图形对象。

【语法介绍】

● clf 删除当前窗口下所有可视的图形对象。

● clf RESET或clf('reset') 删除当前窗口下所有可视的图形对象,并重新设置图形对象的位置、单位的属性值至默认值。

● clf(fig) 删除句柄为fig的窗口下的图形对象。

● clf(fig,'reset') 删除句柄为fig的窗口下的图形对象,并重新设置位置、单位的属性值至默认状态。

● figure_handle=clf(...) 返回所删除的图形的句柄给figure_handle。

【实例】 创建曲线图形,然后删除图形对象。

            >> x = -pi:.1:pi;
            y = sin(x);
            plot(x,y)                  %创建曲线图形,如图2.58(a)所示
            >>clf;                     %删除图形对象,如图2.58(b)所示

图2.58 使用clf函数删除图形对象

2.1.26 contourf——绘制二维等高线图

【功能】 绘制二维等高线图。

【语法介绍】

● contourf(Z) 绘制矩阵的等高线图,其中矩阵Z是距平面的高度,Z至少为2×2矩阵。

● contourf(Z,n) 绘制矩阵Z的n条等高线。

● contourf(Z,v) 绘制指定高度上矩阵的等高线图。参量v为向量,表示等高线指定高度,等高线数量为v的长度。

● contourf(X,Y,Z) 绘制曲面的等高线。(x(i),y(i))是平面z=0上点的坐标矩阵,Z为相应点的高度值矩阵。

● contourf(X,Y,Z,n) 绘制曲面的n条等高线。其他参量及结果同上。

● contourf(X,Y,Z,v) 绘制指定高度上曲面的等高线图。参量v为向量,表示等高线指定高度,等高线数量为v的长度。

● contourf(axes_handle,...) 在句柄为axes_handle的轴上绘制曲面或矩阵的等高线图。

● C=contourf(...) 返回等高矩阵C。

● [C,h]=contourf(...) 返回等高矩阵C和线句柄或块句柄列向量h。

【实例】 绘制peaks函数的等高线图,并且返回等高矩阵C和线句柄列向量h。

        >>[C,h]=contourf(peaks(20),10);         %绘制等高线图,如图2.59所示
        colormap autumn                         %设置颜色表

图2.59 绘制peaks函数的等高线图