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 等值线图绘制示例