5.2 二维图形

5.2.1 plot命令

plot命令是使用MATLAB绘制图形最为常见和最为典型的命令,其可以实现二维绘图、图形设置等功能。该命令的调用格式如下:

    plot(Y)
    plot(X1, Y1, ..., Xn, Yn)
    plot(X1, Y1, LineSpec, ..., Xn, Yn, LineSpec)
    plot(..., 'PropertyName', PropertyValue, ...)
    plot(axes_handle, ...)
    h = plot(...)

其中,Xn为横坐标数据,Yn为纵坐标数据,LineSpec为绘图线的属性,'PropertyName'为绘图属性名,PropertyValue为绘图属性值,axes_handle为坐标轴句柄,h为绘图后返回的图形句柄。

考虑plot的命令的基本应用,下面重点介绍该命令的前三种调用格式。

1.plot(Y)

该命令中的参数Y可以是向量、实数矩阵或复数向量。根据参数Y的类型不同,绘图的方式稍有不同:

● 如果Y为向量,则绘制的图形以向量索引为横坐标值、以向量元素的值为纵坐标值。

● 如果Y为实数矩阵,则绘制Y的列向量对其坐标索引的图形。

● 如果Y为复向量,则绘制的图形以复向量实部为横坐标值、以复向量虚部为纵坐标值。

例5-1, plot(Y)绘图示例。

在命令行窗口输入:

    y1=sin((1:100)/100*pi*2);
    y2=cos((1:100)/100*pi*2);
    y3=[y1' y2'];
    y4=y1'+y2'*i;
    whos
    subplot(221); plot(y1)          %绘制y1,见图5.1左上图
    subplot(222); plot(y2)          %绘制y2,见图5.1右上图
    subplot(223); plot(y3)          %绘制y3,见图5.1左下图
    subplot(224); plot(y4)          %绘制y4,见图5.1右下图

输出结果如下:

    Name          Size                Bytes  Class      Attributes
    y1            1x100                 800  double
    y2            1x100                 800  double
    y3            100x2                1600  double
    y4            100x1                1600  double     complex

得到的图形如图5.1所示。

图5.1 plot(Y)绘图示例

2.plot(X1, Y1, ..., Xn, Yn)

该调用形式下最简单的调用方式为:

    plot(X, Y)

其中,参数X、Y均可为向量和矩阵。

● 当X、Y均为n维向量时,绘制向量Y对向量X的图形,以X为横坐标,Y为纵坐标。

● 当X为n维向量,Y为m×n或n×m的矩阵时,该命令将在同一图内绘得m条不同颜色的连线。

● 当X、Y均为m×n矩阵时,将绘制n条不同连线。绘制规则为:以X矩阵的第i列分量作为横坐标,矩阵Y的第i列分量作为纵坐标,绘得第i条连线。

对于通用的调用形式:

    plot(X1, Y1, ..., Xn, Yn)

Xn、Yn均满足上述绘图规则。

例5-2, plot(X1, Y1, ..., Xn, Yn)绘图示例。

在命令行窗口输入:

    x1=(1:100) /100*pi*2;
    x2=((1:100) -20)/100*pi*2;
    x3=[x1' x2'];
    y1=sin((1:100)/100*pi*2);
    y2=cos((1:100)/100*pi*2);
    y3=[y1' y2'];
    whos
    subplot(221); plot(x1, y1); axis tight             %绘制情形a),见图5.2左上图
    subplot(222); plot(x1, y3); axis tight             %绘制情形b),见图5.2右上图
    subplot(223); plot(x3, y3); axis tight             %绘制情形c),见图5.2左下图
    subplot(224); plot(x1, y2, x3,0.5*y3); axis tight    %绘制通用调用形式,见图5.2右下图

输出结果如下:

    Name          Size                  Bytes  Class      Attributes
    x1            1×100                 800  double
    x2            1×100                 800  double
    x3            100×2                1600  double
    y1            1×100                 800  double
    y2            1×100                 800  double
    y3            100×2                1600  double

得到的图形如图5.2所示。

3.plot(X1, Y1, LineSpec, ..., Xn, Yn, LineSpec)

在该调用形式下最简单的调用方式为:

    plot(X, Y, LineSpec)

其中,X、Y数据要求同前文中一致,LineSpec为属性设置字符,可设置线型、标识和颜色。

图5.2 plot(X1, Y1, ..., Xn, Yn)绘图示例

plot(X1, Y1, LineSpec, ..., Xn, Yn, LineSpec)是plot(X, Y, LineSpec)的一种通用推广形式,其中的参数要求和绘图方式同前文中提到的一致。

例5-3, plot(X1, Y1, LineSpec, ..., Xn, Yn, LineSpec)绘图示例。

在命令行窗口输入:

    x1=(1:100) /100*pi*2;
    x2=((1:100) -20)/100*pi*2;
    x3=[x1' x2'];
    y1=sin((1:100)/100*pi*2);
    y2=cos((1:100)/100*pi*2);
    y3=[y1' y2'];
    subplot(131); plot(x1, y1, 'k.'); axis tight            %见图5.3左图
    subplot(132); plot(x1, y1, 'k.', x2, y2, 'r+'); axis tight     %见图5.3中间图
    subplot(133); plot(x1, y2, 'k.', x3,0.5*y3, 'r+'); axis tight  %见图5.3右图

窗口无输出。得到的图形如图5.3所示。

图5.3 plot(X1, Y1, LineSpec, ..., Xn, Yn, LineSpec)绘图示例

以上介绍的是plot命令的三种常用方式,plot命令还有更多的使用方式,这里不再介绍。如有需要了解,可参考帮助文档。

上文中提到的LineSpec为属性设置字符,可设置线型、标识和颜色。设置线型、标识和颜色的代表字符如表5.1所示。

表5.1 线型S、标识M和颜色C的代表字符

提示

设置属性时,可在线型、标识和颜色中各取最多一种进行设置。

例5-4,线型属性设置示例。

在命令行窗口输入:

    t = 0:pi/20:2*pi;
    plot(t, sin(t), '-.r*')
    hold on; plot(t, sin(t-pi/2), '--mo')
    plot(t, sin(t-pi), ':bs'); hold off

窗口无输出。得到的图形如图5.4所示。

图5.4 线型属性设置示例

5.2.2 图形叠绘

很多时候,用户需要将不同的数据绘制到一张图上,这个时候就需要进行叠绘,即保持原有图形的情况下绘制新的图形。

MATLAB提供hold命令用于图形叠绘控制。默认情况下,图形叠绘功能没有打开,此时绘制图形则会将图上的原有图形覆盖;在打开的情况下,绘制图形时不会覆盖原有图形,而会在上次绘制的基础上叠加。

hold命令有3种用法。

(1)hold on

功能:使当前轴及图形保留下来,而不被覆盖,并接受即将绘制的新的曲线。

(2)hold off

功能:不保留当前轴及图形,绘制新的曲线后,原图即被覆盖。

(3)hold

功能:hold on语句与hold off语句的切换。

例5-5,图形叠绘示例。

在命令行窗口输入:

    x = -pi:pi/20:pi;
    figure; hold off ; subplot(121);
    plot(sin(x))
    plot(cos(x)) %绘制结果如图5.5的左图所示
    subplot(122); plot(sin(x))
    hold on;
    plot(cos(x)) %绘制结果如图5.5的右图所示
    hold off

命令行窗口无输出。得到的图形如图5.5所示。

图5.5 图形叠绘示例

5.2.3 子图绘制

很多时候,在同一视图中绘制多个图形可便于分析比较数据或操作方法等,MATLAB提供了subplot函数来实现这一功能。

subplot函数最常用的调用格式为:

    subplot(m, n, p)

其代表的含义为将在(m, n)幅子图中的第p幅图作为当前曲线的绘制图。

提示

(1)subplot(m, n, k)命令生成的图窗中将会有(m, n)幅子图,k是子图的编号,编号的顺序如下:左上为第1幅子图,然后先向右后向下依次排号。

(2)命令所产生的子图彼此相互独立,所有的绘图命令都可以在任一子图中运用,而对其他的子图不起作用。

(3)在书写该命令时,(m, n, k)形式也可以写成(mnk)形式。

(4)在使用subplot命令之后,如果再想绘制整个图窗的图时,应先使用clf命令进行清空。

(5)不同位置的子图可以根据需要进行组合来绘制非对称子图。

例5-6,对称子图的绘制说明。

在命令行窗口输入:

    subplot(2,2,1)
    text(.5, .5, {'subplot(2,2,1)'; 'or subplot 221'}, 'FontSize',14,
'HorizontalAlignment', 'center')
    subplot(2,2,2)
    text(.5, .5, {'subplot(2,2,2)'; 'or subplot 222'}, 'FontSize',14,
'HorizontalAlignment', 'center')
    subplot(2,2,3)
    text(.5, .5, {'subplot(2,2,3)'; 'or subplot 223'}, 'FontSize',14,
'HorizontalAlignment', 'center')
    subplot(2,2,4)
    text(.5, .5, {'subplot(2,2,4)'; 'or subplot 224'}, 'FontSize',14,
'HorizontalAlignment', 'center')

命令行窗口无输出。得到的图形如图5.6所示。

图5.6 绘制对称子图

例5-7,非对称子图的绘制示例。

在命令行窗口输入:

    subplot(2,2, [1 3])
    text(.5, .5, 'subplot(2,2, [1 3])', 'FontSize',14, 'HorizontalAlignment', 'center')
    subplot(2,2,2)
    text(.5, .5, 'subplot(2,2,2)', 'FontSize',14, 'HorizontalAlignment', 'center')
    subplot(2,2,4)
    text(.5, .5, 'subplot(2,2,4)', 'FontSize',14, 'HorizontalAlignment', 'center')

命令行窗口无输出。得到的图形如图5.7所示。

图5.7 绘制非对称子图

5.2.4 交互绘图

交互绘图是指使用鼠标进行绘图。在MATLAB中,相应的鼠标操作的图形操作命令包括:ginput、gtext和zoom函数。

提示

(1)除ginput函数只能用于二维图形外,其余函数对二维和三维图形均适用。

(2)ginput函数与zoom函数配合使用,可从图形中获得较准确的数据。

(3)在逻辑顺序不清晰的情况下,不提倡同时使用这几个命令。

1.ginput命令

该函数典型的调用格式如下:

    [x, y]=ginput(n)

其功能为使用鼠标从二维图形中获得n个点的数据坐标(x, y)。其中,n应为正整数。

该命令运行之后,会将当前的图形从后台调度到前台,同时,鼠标光标变化为十字,用户可以移动鼠标,将其位置定位于待取点的位置处,单击鼠标左键,则可获得该点的数据值,然后通过相同的方式,取得之后的n-1组数据值,当n组数据全部取得之后,图窗便退回后台,即返回到ginput命令执行前的环境中。

2.gtext命令

该函数典型的调用格式如下:

    gtext('string')
    gtext({'string1'; 'string2'; 'string3'; ...})

其功能为用鼠标把字符串或字符串元胞数组放置到图形中作为文字说明。

该命令运行后,会将当前的图形从后台调度到前台,同时,鼠标光标变化为十字,用户可以移动鼠标,将其位置定位于待放置的位置处,单击鼠标右键,则字符串将被放在紧靠十字中心点的“第一象限”位置上。

如果输入的是单个字符串,则单击鼠标左键可以一次性将所有字符以单行的形式放置在图形之中;如果输入的是多行字符串,则每次单击鼠标左键的操作可将其中的一行字符串放置在图形之中,直到将所有的字符串全部放置完成后,操作完成。

3.zoom命令

该函数典型的调用格式如表5.2所示。

表5.2 缩放命令典型格式

使用zoom命令时,其变焦操作方式与标准的Windows缩放相同,可直接单击鼠标进行图形放大,也可以选择区域放大,还可以单击鼠标右键使图形缩小。

以上三个命令可以使得交互绘图很简便,读者在绘图时可以尝试,本书对此不再赘述。

5.2.5 双纵坐标图

很多时候都需要把同一自变量的两个不同量纲和量级的因变量同时绘制在同一个图窗中进行比较,这时需要使用两个纵轴来表现不同的因变量。

MATLAB提供了plotyy函数可以实现上述功能。该函数的典型调用形式如下:

    plotyy(X1, Y1, X2, Y2)
    plotyy(X1, Y1, X2, Y2, function)
    plotyy(X1, Y1, X2, Y2, 'function1', 'function2')

其中,X1-Y1和X2-Y2为两条曲线,function表示用来绘图的函数,可用的函数包括plot、semilogx、semilogy、loglog和stem等。

例5-8,双坐标轴绘制示例。

在命令行窗口中输入:

    x = 0:0.01:20;
    y1 = 200*exp(-0.05*x);
    y2 = 0.8*exp(-0.5*x);
    figure;
    subplot(131); plotyy(x, y1, x, y2)                    %见图5.8左图
    subplot(132); plotyy(x, y1, x, y2, 'semilogy')               %见图5.8中间图
    subplot(133); plotyy(x, y1, x, y2, 'plot', 'semilogy')       %见图5.8右图

命令行窗口无输出。得到的图形如图5.8所示。

提示

上例中涉及的特殊坐标轴将在下小节中进行介绍。

图5.8 双坐标轴绘制示例

5.2.6 特殊坐标绘图

在实际情况中,很多数据表现出指数性的变化规律;这时需要采用对数坐标来刻画图形的特征。还有的时候需要采用极坐标绘制图形。

本小节将对这些特殊坐标的绘图方式进行介绍。

1.对数坐标

MATLAB提供了semilogx、semilogy和loglog函数来绘制对数坐标图。

● semilogx:该函数对x轴的刻度求常用对数(以10为底),而y轴为线性刻度。

● semilogy:该函数对y轴的刻度求常用对数(以10为底),而x轴为线性刻度。

● loglog:该函数对x、y轴的刻度均求常用对数(以10为底)。

这三个函数的具体调用方式与plot函数基本相同。

例5-9,对数坐标绘图示例。

在命令行窗口中输入:

    x = 0:100;
    y = exp(0.05*x);
    figure;
    subplot(221); plot (x, y)
    axis tight; title(' plot ');                %见图5.9左上图
    subplot(222); semilogx (x, y)
    axis tight; title(' semilogx ');            %见图5.9右上图
    subplot(223); semilogy (x, y)
    axis tight; title(' semilogy ');            %见图5.9左下图
    subplot(224); loglog (x, y)
    axis tight; title(' loglog ');              %见图5.9右下图

命令行窗口无输出。得到的图形如图5.9所示。

图5.9 对数坐标绘图示例

2.极坐标

极坐标图可通过polar命令来绘制。该命令接受极坐标形式的函数,并在直角平面坐标系中绘制极坐标形式的图形。

polar命令典型的调用格式如下:

    polar(theta, rho)
    polar(theta, rho, LineSpec)

其中,极角theta为从x轴到半径的单位为弧度的向量,极径rho为各数据点到极点的半径向量,LineSpec用于设置极坐标图中线条的线型、标识和颜色等。

例5-10,极坐标图示例。

在命令行窗口中输入:

    t = 0:.01:2*pi;
    y= sin(2*t).*cos(2*t);
    subplot(121); plot(t, y, 'k');
    axis tight; title('plot');                        %见图5.10左图
    subplot(122); polar(t, sin(2*t).*cos(2*t), '--k')
    axis tight; title('polar');                       %见图5.10右图

命令行窗口无输出。得到的图形如图5.10所示。

图5.10 直角坐标图和极坐标图对比

5.2.7 函数绘图

前文中提到的绘图均采用了已有的离散数据,下面对函数对象的绘图进行说明。在实际应用中,函数随着自变量的变化趋势常常是未知的,可能在不同的区域内表现出了很大区别的变化差异,这时采用plot命令进行绘图将会使图变得十分粗糙。

针对这种情况,MATLAB提供了fplot函数和ezplot函数的绘图命令来绘制这类图形。

1.fplot函数

该函数典型的调用格式如下:

    fplot(fun, limits)
    fplot(fun, limits, LineSpec)
    fplot(fun, limits, tol)
    fplot(fun, limits, tol, LineSpec)
    fplot(fun, limits, n)

其中,fun为待绘制的函数,limit表示绘制时自变量的上下限,LineSpec用于设置绘制线的属性,tol表示容许误差,n表示最少分段数。

例5-11,函数图绘制示例。

在命令行窗口中输入:

    t1= 0.01:0.005:0.1;
    t2= 0.01:0.001:0.1;
    t3= 0.01:0.0002:0.1;
    sn = @(x) sin(1./x);
    y1= sn(t1);
    y2= sn(t2);
    y3= sn(t3);
    subplot(411); plot(t1, y1, 'k');
    axis tight; title('plot间距0.005');            %见图5.11上图
    subplot(412); plot(t2, y2, 'k');
    axis tight; title('plot间距0.001');            %见图5.11中上图
    subplot(413); plot(t3, y3, 'k');
    axis tight; title('plot间距0.0002');                %见图5.11中下图
    subplot(414); fplot(sn, [0.01 0.1])
    axis tight; title('fplot自动调整间距’);          %见图5.11下图

命令行窗口无输出。得到的图形如图5.11所示。

图5.11 函数图与普通图对比

2.ezplot函数

该函数典型的调用格式如下:

    ezplot(fun)
    ezplot(fun, [xmin, xmax])
    ezplot(fun2)
    ezplot(fun2, [xymin, xymax])
    ezplot(fun2, [xmin, xmax, ymin, ymax])
    ezplot(funx, funy)
    ezplot(funx, funy, [tmin, tmax])

其中,fun为待绘制的函数,默认的自变量范围为-2π<x<2π,可通过[xmin, xmax]设置自变量范围;fun2为隐式函数fun2(x, y),自变量为x、y,自变量的使用同fun; funx、funy为对自变量t的函数,自变量的使用同fun。

例5-12, ezplot函数绘图示例。

在命令行窗口中输入:

    subplot(231); ezplot('sin(x)')                                    %见图5.12左上图
    subplot(232); ezplot('sin(x)', [-pi, pi])                         %见图5.12中上图
    subplot(233); ezplot('x^2-y^2-1')                                 %见图5.12右上图
    subplot(234); ezplot('x^2-y^2-1', [-10,10, -10,10])               %见图5.12左下图
    subplot(235); ezplot('cos(x)', 'sin(x)')                          %见图5.12中下图
    subplot(236); ezplot('cos(x)', 'sin(x)', [-0.75*pi, pi])         %见图5.12右下图

命令行窗口无输出。得到的图形如图5.12所示。

图5.12 ezplot函数绘图示例