MATLAB特殊图形和高维可视化

来源:互联网 发布:软件质量保证计划内容 编辑:程序博客网 时间:2024/05/21 21:49

7.4 特殊图形和高维可视化
7.4.1 特殊图形指令例示
7.4.1.1 面域图area

【 * 例 7.4.1 .1-1 】面域图指令 area 。该指令的特点是:在图上绘制多条曲线时,每条曲线(除第一条外)都是把“前”条曲线作基线,再取值绘制而成。因此,该指令所画的图形,能醒目地反映各因素对最终结果的贡献份额。 注意:( 1 ) area 的第一输入宗量是单调变化的自变量。第二输入宗量是“各因素”的函数值矩阵,且每个“因素”的数据取列向量形式排放。第三输入宗量是绘图的基准线值,只能取标量。当基准值为 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

Matlab
图 7.4.1 .1-1 面域图表现各分量的贡献


7.4.1.2 各种直方图bar, barh, bar3, bar3h

【 * 例 7.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')

Matlab
图 7.4.1 .2-1 二维直方图

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')

Matlab
图 7.4.1 .2-2 三维直方图


7.4.1.3 饼图pie, pie3

【 * 例 7.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)

Matlab
图 7.4.1 .3-1 饼形统计图


7.4.1.4 填色图fill,fill3

【 * 例 7.4.1 .4-1 】读者试验本例时,注意三点: MATLAB 画任意多边形的一种方法;保证绘图数据首尾重合,使勾画多边形封闭;使用图柄对图形的属性进行精细设置。
clf;n=10; % 多边形的边数
dt=2*pi/n;t=0:dt:2*pi
t=[t,t(1)]; %fill 指令要求数据向量的首位重合,使图形封闭。
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') % 依靠图柄设置属性。

Matlab
图 7.4.1 .4-1 由 fiil 产生的填色多边形

【例 7.4.1 .4-2 】三维填色指令 fill3 演示。注意:( 1 ) X,Y,Z 的相应列元素构成一个三维封闭多边形。本例有 4 列,因此有 4 个多边形。图 7.4.1.4-2 中的“ 1 , 2 , 3 , 4 ” 号三角形分别由 X,Y,Z 的第 1 , 2 , 3 , 4 列生成。( 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

Matlab
图 7.4.1 .4-2 三维填色


7.4.1.5 射线图compass和羽毛图feather

【 * 例 7.4.1 .5-1 】 compass 和 feather 指令的区别。
t=-pi/2:pi/12:pi/2; % 在 Matlab区间,每 Matlab取一点。
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')

Matlab
图 7.4.1 .5-1 compass 和 feather 指令的区别


7.4.1.6 Voronoi图和三角剖分

【 * 例 7.4.1 .6-1 】用 Voronoi 多边形勾画每个点的最近邻范围。 Voronoi 多边形在计算几何、模式识别中有重要应用。从本例图 7.4.1.6-1 中,可以看到,三角形顶点所在多边形的三条公共边是剖分三角形边的垂直平分线。
clf;rand('state',111) 
n=30;A=rand(n,1)-0.5;B=rand(n,1)-0.5; % 产生 30 个随机点
T=delaunay(A,B); % 求相邻三点组
T=[T T(:,1)]; % 为使三点剖分三角形封闭而采取的措施
voronoi(A,B) % 画 Voronoi 图
hold on;axis square
fill(A(T(10, :)),B(T(10,:)),'y'); % 画一个剖分三角形
voronoi(A,B) % 重画 Voronoi 图,避免线被覆盖。

Matlab
图 7.4.1 .6-1 Voronoi 多边形和 Delaubay 三角剖分


7.4.1.7 彩带图ribbon

【 * 例 7.4.1 .7-1 】用彩带绘图指令 ribbon ,绘制归化二阶系统 Matlab在不同 Matlab值时的阶跃响应,如图 7.4.1.7-1 所示。对于本例程序,有以下几点值得注意:( 1 )程序中使用了 Control Toolbox 中的两个指令tf 和 step 。这 tf 是一个( MATLAB5.x 版起用的)“对象”。( 2 )本例构作的 S 是一个单输入 8 输出系统,作用于该 S 的 step 指令也将在一次调用中产生 8 个子系统的阶跃响应。( 3 )在下段程序运行后,有兴趣的读者可显示 S ,以观察系统是如何描写的。( 4 )本例为了得到较好的表现效果,采用了视角、明暗、色图、光照控制。( 5 )为使程序有一定通用性,图例采用元胞数组生成。( 6 )本例产生的图 7.4.1.7-1 中,除“ Matlab”外,所有标识都是由下段指令产生的。( 7 )“ Matlab”中的斜向箭头无法由指令生成,而是直接通过“图形窗”编辑实现的( MATLAB5.3 版起用)。( 8 )本例程序有通用性。只要修改第 <2> 条指令对阻尼系数的设定,就可获得响应的彩带图形。
clear,clf 
zeta2=[0.1 0.2 0.3 0.4 0.5 0.6 0.8 1.0]; %<2>
n=length(zeta2); for k=1:n;Num{k,1}=1;Den{k,1}=[1 2*zeta2(k) 1];end
S=tf(Num,Den); % 产生单输入多输出系统
t=(0:0.4:30)'; % 时间采样点
[Y,x]=step(S,t); % 单输入多输出系统的响应
tt=t*ones(size(zeta2)); % 为画彩带图,生成与函数值 Y 维数相同的时间矩阵。
ribbon(tt,Y,0.4) % 画彩带图

% 至此彩带图已经生成。以下指令都是为了使图形效果更好、标识更清楚而用。
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} + 2/zetas + 1)^{-1}';
str2='/fontsize{16}/fontname{ 隶书 } 取不同 ';
str3='{/fontsize{10}/it/zeta}';
str4='/fontsize{16}/fontname{ 隶书 } 时的阶跃响应 ';
title([str1,str2,str3,str4]),zlabel('/ity(/zeta,t) /rightarrow')

Matlab
图 7.4.1 .7-1 二阶系统在不同阻尼系数时的响应


7.4.1.8 离散杆图stem , stem3

【 * 例 7.4.1 .8-1 】本例表现一个离散方波的快速 Fourier 变换的幅频。本例左图用极坐标指令 polar 绘出,右图用三维离散杆图指令 stem3 绘出。
    MATLAB 的 polar 指令是建筑在 plot 基础上的。指令执行后,出现的极坐标轴及分度标识也是由 plot 以一种“固定”模式产生的。因此,极坐标轴的控制很不灵活,它只能以比较简单的方式表达函数。如对于本例左图,那图形小、线条细、文字太密的缺陷,就较难克服。相比而言,先借助极坐标和直角坐标转换,然后再通过直角坐标图形指令加以表现,往往更显灵活、方便。如本例的右图。
th = (0:127)/128*2*pi; % 角度采样点
rho=ones(size(th)); % 单位半径
x = cos(th);y = sin(th);
f = abs(fft(ones(10,1),128)); % 对离散方波进行 FFT 变换,并取幅值。
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]) % 控制角度,为表现效果。

Matlab
图 7.4.1 .8-1 离散方波的幅频谱

7.4.1.9 二维半图指令pcolor, contour, contourf

【 * 例 7.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); % 获得 peaks 图形数据
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) % 沿线标识法

Matlab
图 7.4.1 .9-1 “二维半”指令的演示


7.4.1.10 散点图scatter , scatter3 , plotmatrix

【 * 例 7.4.1 .10-1 】表现函数 Matlab。请注意本例中的 3 个指令:( 1 )散点图指令 scatter3 ,标志三维数据点。它的前三个输入宗量必须是同长的向量,如指令 <5> 。( 2 )带垂帘的网线图指令 meshz ,它的调用格式与 mesh 没有什么不同。此外,再次提醒读者注意指令 <2> 。这样处理的目的是避免 0/0 的不定性。该处理方法是求极限的一种数值方法。
x=3*pi*(-1:0.2:1);y=x;[X,Y]=meshgrid(x,y); 
R=sqrt(X.^2+Y.^2)+eps;Z=sin(R)./R;% 引入 eps 避免 0/0 , %<2>
C=abs(del2(Z)); % 求“五点格式”差分,反映曲面变化。
meshz(X,Y,Z,C) % 由曲面变化决定用色
hold on,scatter3(X(:),Y(:),Z(:),'filled') %<5>
hold off,colormap(hot)

Matlab
图 7.4.1 .10-1 三维散点图

【 * 例 7.4.1 .10-2 】指令 plotmatrix 有两种基本调用方式:( 1 )对于数据矩阵 Matlab维的 X 和 Matlab维的 Y ,调用格式 plotmatrix(X,Y) 将画出一个分割成 Matlab个子散点图。其中第 Matlab个子散点图是根据 Y 第 Matlab列和 X 第 Matlab列数据画出的。( 2 )对于数据矩阵 Matlab维的 X ,调用格式 plotmatrix(X) 将画出分割成 Matlab个子块的图。该图的对角块,画出的是 X 每列的数据的频数直方图;而其他子块是相应列构成的散点图。该指令可用来观察数据矩阵(或同一矩阵列向量)间的统计关系。
randn('seed',1111),X=randn(100,2);Y=randn(100,2); 
subplot(1,3,1),plotmatrix(X)
subplot(1,3,2),plotmatrix(X,X)
subplot(1,3,3),plotmatrix(X,Y)

Matlab
图 7.4.1 .10-2 plotmatrix 表现数据统计特性

7.4.1.11 不规则数据的网线图和曲面图

【 * 例 7.4.1 .11-1 】用三角网线、曲面图表现函数 Matlab
rand('seed',22),X=6*pi*(rand(20,10)-0.5);Y=6*pi*(rand(20,10)-0.5); 
R=sqrt(X.^2+Y.^2)+eps;Z=sin(R)./R;
tri=delaunay(X,Y); % 进行三角剖分
subplot(1,2,1),trimesh(tri,X,Y,Z)
subplot(1,2,2),trisurf(tri,X,Y,Z)
colormap(jet);brighten(0.5) % 增强亮度

Matlab
图 7.4.1 .11-1 不规则数据的三维表现


7.4.1.12 泛函绘图指令fplot

【 * 例 7.4.1 .12-1 】 fplot 与一般绘图指令的绘图效果比较。
[x,y]=fplot('cos(tan(pi*x))',[-0.4,1.4],0.2e-3);n=length(x); 
subplot(1,2,1),plot(x,y)
title('/fontsize{20}/fontname{ 隶书 } 泛函绘图指令效果 ')
t=(-0.4:1.8/n:1.4)';
subplot(1,2,2),plot(t,cos(tan(pi*t)))
title('/fontsize{20}/fontname{ 隶书 } 等分采样绘图 ')

Matlab
图 7.4.1 .12-1 右图曲线中底部有明显绘图缺陷


7.4.2 四维表现
7.4.2.1 用色彩表现函数的特征

【 * 例 7.4.2 .1-1 】用色图阵表现函数的不同特征。演示:当三维网线图、曲面图的第四个输入宗量取一些特殊矩阵时,色彩就能表现或加强函数的某特征,如梯度、曲率、方向导数等。
x=3*pi*(-1:1/15: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); % 计算对 r 的全导数
dz2=del2(Z); % 计算曲率 <4>
subplot(1,2,1),surf(X,Y,Z),title('No. 1 surf(X,Y,Z)')
shading faceted,colorbar( 'horiz') ,brighten(0.2)
subplot(1,2,2),surf(X,Y,Z,R),title('No. 2 surf(X,Y,Z,R)')

shading faceted;colorbar( 'horiz')

Matlab
图 7.4.2 .1-1 色彩分别表现函数的高度和半径特征

clf;subplot(1,2,1),surf(X,Y,Z,dzdx) 
shading faceted;brighten(0.1);colorbar( 'horiz')
title('No. 3 surf(X,Y,Z,dzdx)')
subplot(1,2,2),surf(X,Y,Z,dzdy)
shading faceted;colorbar( 'horiz')
title('No. 4 surf(X,Y,Z,dzdy)')

Matlab
图 7.4.2 .1-2 色彩分别表现函数的 x 方向和 y 方向导数特征

subplot(1,2,1),surf(X,Y,Z,abs(dzdr)) 
shading faceted;brighten(0.6);colorbar( 'horiz')
title('No. 5 surf(X,Y,Z,abs(dzdr))')
subplot(1,2,2),surf(X,Y,Z,abs(dz2)) %<17>
shading faceted;colorbar( 'horiz')
title('No. 6 surf(X,Y,Z,abs(dz2))')

Matlab
图 7.4.2 .1-3 色彩分别表现函数的径向导数和曲率特征


7.4.2.2 切片图和切片等位线图

【 * 例 7.4.2 .2-1 】利用 slice 和 contourslice 表现 MATLAB 提供的无限大水体中水下射流速度数据 flow 。 flow 是一组定义在三维空间上的函数数据。
在本例中,从图中的色标尺可知,深红色表示“正速度”(向图的左方),深蓝表示“负速度”(向图的右方)。
% 以下指令用切面上的色彩表现射流速度
clf;[X,Y,Z,V]=flow; % 取 4 个 Matlab的射流数据矩阵, V 是射流速度。
x1=min(min(min(X)));x2=max(max(max(X))); % 取 x 坐标上下限
y1=min(min(min(Y)));y2=max(max(max(Y))); % 取 y 坐标上下限
z1=min(min(min(Z)));z2=max(max(max(Z))); % 取 z 坐标上下限
sx=linspace(x1+1.2,x2,5); % 确定 5 个垂直 x 轴的切面坐标
sy=0; % 在 y=0 处,取垂直 y 轴的切面
sz=0; % 在 z=0 处,取垂直 z 轴的切面
slice(X,Y,Z,V,sx,sy,sz); % 画切片图
view([-12,30]);shading interp;colormap jet;axis off;colorbar

Matlab
图 7.4.2 .2-1 切片图

% 以下指令用等位线表现射流速度
clf;v1=min(min(min(V)));v2=max(max(max(V))); % 射流速度上下限
cv=linspace(v1,v2,15); % 在射流上下限之间取 15 条等位线
contourslice(X,Y,Z,V,sx,sy,sz,cv);view([-12,30])
colormap jet;colorbar;box on

Matlab
图 7.4.2 .2-2 切片等位线图


7.4.3 动态图形
7.4.3.1 彗星状轨迹图

【 * 例 7.4.3 .1-1 】简单二维示例。(请读者自己在指令窗中运行以下指令。)
shg;n=10;t=n*pi*(0:0.0005:1);x=sin(t);y=cos(t);
plot(x,y,'g');axis square;hold on
comet(x,y,0.01);hold off

【 * 例 7.4.3 .1- 2 】卫星返回地球的运动轨线示意。(请读者自己在指令窗中运行以下指令。)
shg;R0=1; % 以地球半径为一个单位
a=12*R0;b=9*R0;T0=2*pi; %T0 是轨道周期
T=5*T0;dt=pi/100;t=[0:dt:T]';
f=sqrt(a^2-b^2); % 地球与另一焦点的距离
th=12.5*pi/180; % 卫星轨道与 x-y 平面的倾角
E=exp(-t/20); % 轨道收缩率
x=E.*(a*cos(t)-f);y=E.*(b*cos(th)*sin(t));z=E.*(b*sin(th)*sin(t));
plot3(x,y,z,'g') % 画全程轨线
[X,Y,Z]=sphere(30);X=R0*X;Y=R0*Y;Z=R0*Z; % 获得单位球坐标
grid on,hold on,surf(X,Y,Z),shading interp % 画地球
x1=-18*R0;x2=6*R0;y1=-12*R0;y2=12*R0;z1=-6*R0;z2=6*R0;
axis([x1 x2 y1 y2 z1 z2]) % 确定坐标范围
view([117 37]),comet3(x,y,z,0.02),hold off % 设视角、画运动轨线

Matlab
图 7.4.3 .1-1 卫星返回地球轨线示意


7.4.3.2 色图的变幻

【例 7.4.3 .2-1 】色彩变幻(因印刷关系,无法表现。请读者自己在指令窗中运行以下指令。注意:在 256 色情况下,才可被正确执行)
peaks
spinmap

7.4.3.3 影片动画 

【 * 例 7.4.3 .3-1 】三维图形的影片动画。(因印刷关系,无法表现本例。请读者自己在指令窗中运行以下指令。)
clf;shg,x=3*pi*(-1:0.05:1);y=x;[X,Y]=meshgrid(x,y);
R=sqrt(X.^2+Y.^2)+eps; Z=sin(R)./R;
h=surf(X,Y,Z);colormap(jet);axis off
n=12;mmm=moviein(n); % 预设画面矩阵。新版完全可以取消此指令 。
for i=1:n
rotate(h,[0 0 1],25); % 是图形绕 z 轴旋转 25 度 / 每次
mmm(:,i)=getframe; % 捕获画面。新版改为 mmm(i)=getframe 。
end

movie(mmm,5,10) % 以每秒 10 帧速度,重复播放 5 次

原创粉丝点击