5.5 特殊图形

MATLAB提供的常见特殊二维图形函数和特殊三维图形函数如表5.3和表5.4所示。

表5.3 二维特殊图形函数

表5.4 三维特殊图形函数

本节将介绍一些常见的特殊图形的绘制方法。

5.5.1 饼状图

二维饼状图可采用pie函数进行绘制,该函数的调用格式如下:

    pie(X)
    pie(X, explode)
    pie(..., labels)

上述命令为绘制参数x的饼图;explode为与x同维的矩阵,如果其中有非零元素,矩阵中的相应位置的元素在饼图中对应的扇形将向外移出一些,加以突出;labels用于定义相应块的标签。

相应的,三维饼图可采用pie3函数进行绘制。该函数的调用格式如下:

    pie3(X)
    pie3(X, explode)
    pie3(..., labels)

参数的含义与pie函数相同。

例5-18,二维饼图和三维饼图绘制示例。

在命令行窗口中输入:

    x = [2 5 0.5 3.5 2];
    explode = [0 1 0 1 0];
    subplot(121); pie(x, explode)        %见图5.18左图
    colormap jet
    subplot(122); pie3(x, explode)            %见图5.18右图
    colormap hsv

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

图5.18 二维饼图和三维饼图绘制示例

5.5.2 直方图

MATLAB提供hist命令绘制统计直方图。该函数的调用格式如下:

    n = hist(Y)
    n = hist(Y, x)
    n = hist(Y, nbins)

其中,Y为待统计量,x为分组向量,nbins用于指定条形的数目。

该命令可以显示出数据的分布情况。所有向量y中的元素或者是矩阵y的列向量中的元素都是根据它们的数值范围来分组的,每一组作为一个条形进行显示。

还可以通过histc计算统计分布量。histc的调用格式如下:

    n = histc(x, edges)
    n = histc(x, edges, dim)

其中x为待统计量,edges为统计范围,dim代表维度。

例5-19,绘制统计直方图并计算绘制累积分布柱状图。

在命令行窗口中输入:

    x = -2.9:0.1:2.9;
    y = randn(100000,1);
    subplot(121); hist(y, x)                         %见图5.19左图
    n_elements = histc(y, x);
    c_elements = cumsum(n_elements);
    subplot(122); bar(x, c_elements, 'BarWidth',1)   %见图5.19右图

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

图5.19 绘制统计直方图与累积分布柱状图

5.5.3 柱形图

MATLAB提供bar命令绘制柱形图。该函数的调用格式如下:

    bar(Y)
    bar(x, Y)
    bar(___, Name, Value)
    bar(___, width)
    bar(___, style)
    bar(___, bar_color)

其中,Y为待绘制的向量或矩阵;x定义x轴方向的绘制位置;width为绘制宽度占空比,默认为0.8; style定义形状类型,可以取值’group'、'stacked'、'hist’和’histc’等;bar_color定义颜色;Name和Value分别设置属性名和定义属性值。

绘制水平柱形图可以采用barh函数。该函数的调用格式如下:

    barh(Y)
    barh(X, Y)
    barh(..., width)
    barh(..., 'style')

参数参考bar函数。

相应的,三维柱形图可采用bar3函数进行绘制。该函数的调用格式如下:

    bar3(Y)
    bar3(x, Y)
    bar3(..., width)
    bar3(..., 'style')
    bar3(..., LineSpec)

参数参考bar函数,但style可以取值’group'、'stacked’和’detached’等。三维横向柱形图可采用bar3h函数进行绘制,关于该函数的介绍,请参考barh函数,这里不再赘述。

例5-20,二维柱形图绘制示例。

在命令行窗口中输入:

    y1 = [123.203,131.669, 150.697,179.323,203.212]';
    y2= [75.995,91.972,105.711, 226.505,249.633]';
    Y= [y1, y2];
    x=[2:4:18]';
    subplot(241); bar(y1); title('Default')
    subplot(242); bar(y1,0.4); title('Width=0.4')
    subplot(243); bar(x, y1); title('Specified x ')
    subplot(244); barh(x, y1); title('Horizontal')
    subplot(245); bar(Y, 'grouped'); title('Group')
    subplot(246); bar(Y, 'stacked'); title('Stack')
    subplot(247); bar(Y, 'histc'); title('Histc')
    subplot(248); bar(Y, 'hist'); title('Hist')

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

图5.20 二维柱形图绘制示例

例5-21,三维柱形图绘制示例。

在命令行窗口中输入:

    load count.dat;
    y = count(1:10, :);
    subplot(241); bar3(y, 'detached'); title('Detached'); axis tight;
    subplot(242); bar3(y,0.5, 'detached'); title('Width = 0.5'); axis tight;
    subplot(243); bar3(y, 'grouped'); title('Grouped'); axis tight;
    subplot(244); bar3(y,0.25, 'grouped'); title('Width = 0.25'); axis tight;
    subplot(245); bar3(y, 'stacked'); title('Stacked'); axis tight;
    subplot(246); bar3(y,0.25, 'stacked'); title('Width = 0.25'); axis tight;
    subplot(247); bar3h(y, 'detached'); title('Detached'); axis tight;
    subplot(248); bar3h(y,0.5, 'detached'); title('Width = 0.5'); axis tight;

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

图5.21 三维柱形图绘制示例

5.5.4 离散数据点图

离散数据点图又称为火柴杆图。MATLAB提供stem命令用于绘制二维火柴杆图,该命令的常用调用格式如下:

    stem(Y)
    stem(X, Y)
    stem(..., 'fill')
    stem(..., LineSpec)

其中,Y是待绘制的数据点纵坐标;X为待绘制的数据点横坐标;'fill’代表填充点的颜色;LineSpec设置火柴杆线的属性。

相应的,三维火柴杆图可以使用stem3命令绘制,该命令的常用调用格式如下:

    stem3(Z)
    stem3(X, Y, Z)
    stem3(..., 'fill')
    stem3(..., LineSpec)

该命令的各项参数可参考stem命令,这里不再赘述。

例5-22,离散数据点图绘制示例。

在命令行窗口中输入:

    t = linspace(-2*pi,2*pi,10);
    x= cos(t); y= sin(t);
    subplot(231); stem(y); axis tight;
    subplot(232); stem(y, 'fill', '--'); axis tight;
    subplot(233); stem(t, y); axis tight;
    subplot(234); stem(x, y); axis tight;
    subplot(235); stem3(t); axis tight;
    subplot(236); stem3(x, y, t); axis tight;

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

图5.22 离散数据点图绘制示例

5.5.5 散点图

使用scatter函数可以绘制二维散点图。该函数的调用格式如下:

    scatter(X, Y, S, C)
    scatter(X, Y)
    scatter(X, Y, S)
    scatter(..., markertype)
    scatter(..., 'filled')

其中,函数以x, y的值为横纵坐标,绘制散点;S决定点标识的大小;C设置颜色;markertype为标识形状;'fillde’代表填充点的颜色操作。

相应的,scatter3函数可以绘制三维散点图。该函数的调用格式如下:

    scatter3(X, Y, Z, S, C)
    scatter3(X, Y, Z)
    scatter3(X, Y, Z, S)
    scatter3(..., markertype)
    scatter3(..., 'filled')

相关参数的含义如scatter函数的说明。

例5-23,散点图绘制示例。

在命令行窗口中输入:

    load seamount
    subplot(131); scatter(x, y,5, z); axis tight
    subplot(132); scatter(x, y, sqrt(-z/2), [.5 0 0], 'filled'); axis tight
    subplot(133); scatter3(x, y, z,5, 'filled'), view(40,35); axis tight

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

图5.23 散点图绘制示例

5.5.6 向量图

quiver函数可用于绘制二维向量图,即绘制向量场的形状。该函数的调用格式如下:

    quiver(x, y, u, v)
    quiver(u, v)
    quiver(..., scale)
    quiver(..., LineSpec)
    quiver(..., LineSpec, 'filled')

该函数在坐标(x, y)点处用箭头图形绘制向量,如未设置则使用下标代替;(u, v)为相应点的速度分量;'filled’代表填充点的颜色;LineSpec设置线属性;scale是用来控制看到的图中向量“长度”的实数,默认值为1,有时需要设置小的值,以免绘制的向量彼此重叠。

相应的,三维向量图可以使用quiver3函数进行绘制。该函数的调用格式如下:

    quiver3(x, y, z, u, v, w)
    quiver3(z, u, v, w)
    quiver3(..., scale)
    quiver3(..., LineSpec)
    quiver3(..., LineSpec, 'filled')

该函数在坐标(x, y, z)点处用箭头图形绘制,向量(u, v, w)为相应点的速度分量,其余参数与函数quiver相同。

例5-24,向量图绘制示例。

在命令行窗口中输入:

    vz = 10; a = -32;
    t = 0:.1:1;
    z = vz*t + 1/2*a*t.^2;
    vx = 2; x = vx*t; vy = 3; y = vy*t;
    u = gradient(x); v = gradient(y); w = gradient(z);
    scale = 0;
    subplot(131); quiver3(x, y, z, u, v, w, scale); view([70 18])
    title(’抛物运动路径与速度’)
    subplot(132); quiver(x, z, u, w, scale); axis([0 4-10 2])
    title(’抛物运动路径与速度XZ面投影’)
    subplot(133); quiver(y, z, v, w, scale); axis([0 4-10 2])
    title(’抛物运动路径与速度YZ面投影’)

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

图5.24 向量图绘制示例

5.5.7 等值线图

contour命令可用于绘制二维等值线图,其调用格式如下:

    contour(Z)
    contour(Z, n)
    contour(Z, v)
    contour(X, Y, Z)
    contour(X, Y, Z, n)
    contour(X, Y, Z, v)
    contour(..., LineSpec)

其中,输入变量Z为数值矩阵;n为所绘图形等值线的条数;v为向量,等值线条数等于该向量的长度,并且等值线的值为对应向量的元素值;LineSpec用于设置线属性。

相应的,三维等值线的绘制函数为contour3,其调用格式如下:

    contour3(Z)
    contour3(Z, n)
    contour3(Z, v)
    contour3(X, Y, Z)
    contour3(X, Y, Z, n)
    contour3(X, Y, Z, v)
    contour3(..., LineSpec)

其中的参数可以参考前文中出现的内容,这里不再赘述。

提示

很多时候,采用叠绘的方法绘制等值线图、向量图、曲面图等的组合图形,可以更加明确地表达图形的物理意义。

例5-25,等值线图绘制示例。

在命令行窗口中输入:

    [X, Y] = meshgrid([-2:.25:2]);
    Z = X.*exp(-X.^2-Y.^2);
    [px, py] = gradient(Z, .25, .25);
    subplot(221); contour(X, Y, Z,30); title('2D Contour');
    subplot(222); contour3(X, Y, Z,30); title('3D Contour'); view(-15,25)
    subplot(223); contour(X, Y, Z,30); hold on;
    quiver(X, Y, px, py), hold off; title('2D Contour & Quiver');
    subplot(224); contour3(X, Y, Z,30); hold on;
    surface(X, Y, Z, 'EdgeColor', [.8 .8 .8], 'FaceColor', 'none')
    grid off; view(-15,25); title('3D Contour & Surface');

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

图5.25 等值线图绘制示例