1
第三章 图形系统
MATLAB 采用了许多先进技术,以提供功能强大的图形系统。提供的图形函数有四类: 通用图形函数、二维图形函数、三维图形函数和特殊图形函数。此书只介绍前两种中的一些。
一、简单图形的绘制
例1 绘出正弦曲线在一个周期内的图形:
解:输入方括号内的程序,但不输入方括号及%分号后的注解内容,此时字体颜色为黑色。输入完毕,选中它们,按组合键“Ctrl+Enter ”即可。此时自动加括号且字体为绿色。 此时应该在下面显示右侧的图形。
x=0:pi/20:2*pi; %pi 表示圆周率π,步长π/20 y=sin(x);
figure(1) %打开一个新的图形窗口 plot(x,y,'r-') %绘图。'r-'表红线 grid on %给图形加上栅格线 title('sin(\alpha)') %图形加标题 xlabel('\alpha') %给轴加标记 ylabel('sin(\alpha)')
例2 我们还可以将图形窗口进行分割,在每个窗口各绘制一条曲线。如:
x=0:pi/50:2*pi; % 2*pi 内共分100份 k=[1 26 51 76 101]; % x=0是第一个左端点 % x=26是pi/2处等 x(k)=[ ]; %删除正切和余切的奇异点 figure(1) %打开一个新的图形窗口
subplot(2,2,1) %2行2列共4个子图,子图1: plot(x,sin(x)),grid on %绘制正弦曲线 subplot(2,2,2) %子图2:
plot(x,cos(x)),grid on %绘制余弦曲线 subplot(2,2,3) %子图3:
plot(x,tan(x)),grid on %绘制正切曲线
subplot(2,2,4) %子图4:
plot(x,cot(x)),grid on %绘制余切曲线
二、 图形标注
绘制图形后,还该给图形进行标注。如前例,可给图形加标题、坐标轴标记(和曲线说明)等。利用legend 函数可对图中的曲线进行说明。例如,在同一张图上可得到y=x^2和y=x^3曲线:
2
x=-0.5:.1:1.3;y1=x.^2; y2=x.^3; figure(1)
subplot(1,1,1)
plot(x,y1,'r-',x,y2,'k--'), grid on
legend('\ity=x^2','\ity=x^3') title('y=x^2和y=x^3曲线') xlabel('x'), ylabel('y')
注: 字符串中“^”表示上标,下划线“_”表示 下标,上下标后多后字符时用“{}”括住
利用text 函数也可以标注函数曲线。例如,在同一张图上绘制出正弦和余弦曲线: x=-1:pi/50:2*pi;
y1=sin(x); y2=cos(x);y3=0; figure(1)
plot(x,y1,'k-', x,y2,'k-',x,y3,'r-'), grid on text(pi-0.2,0.2,'\leftarrow sin(\alpha)')
text(pi/4+0.05, -0.2, 'cos(\alpha)\rightarrow') title('sin(\alpha)和cos(\alpha)') xlabel('\alpha'),
ylabel('sin(\alpha)和cos(\alpha)')
三、 对数和极坐标系图形绘制——可不看
有时变量变化范围很大,如x 轴从0.01到100,这时如果仍采用plot 绘图,就会失去局部可视性。因此应用对数坐标系来绘图。如:
x=0.01:.01:100; y=log10(x); figure(1)
subplot(2,1,1)
plot(x,y,'k-'), grid on
title('笛卡尔坐标中y=log_{10}(x)曲线'), ylabel('y') subplot(2,1,2)
semilogx(x,y,'k-'), grid on
title('半对数坐标中y=log _{10}(x)曲线')
xlabel('x'), ylabel('y')
对于任一矩阵,通过eig 函数可求得其特征值。为了解这一矩阵的特性,我们期望直观地显示出特征值。由于特征值一般为复数,因此在极坐标上绘制它就更为方便。例如,输入:
3
a=randn(2,2); b=eig(a); c1=abs(b); c2=angle(b); figure(1)
subplot(2,1,1)
plot(b,'rx'), grid on
title('笛卡尔坐标中的特征值表示') subplot(2,1,2) polar(c2,c1,'rx')
gtext('极坐标中的特征值表示') ( 有错)
又如在控制系统中,我们可求出其零点,在极坐标中绘制出零极点图,直观地显示出零极点,这有助于我们对控制系统的深入了解。如输入
num=[11.1]; den=[1 2 5 7 4]; [z,p,k]=tf2zp(num, den); c1=abs(z); c2=angle(z); c3=abs(p); c4=angle(p); figure(1)
subplot(1,1,1)
polar(c4,c3,'bx')
hold on, polar(c2,c1,'ro')
gtext('极坐标中的零极点表示')
三、复杂图形的绘制
在同一个图形窗口中绘制多条曲线是MATLAB 的一大功能,这可以有多种方法。 第一种方法: 将曲线数据保存在n*m 的矩阵y 中,而x 为相应的x 轴向量n*1或1*n,则
plot(x,y)可在同一个图形窗口 中绘制出m 条曲线。这种方法非常适用于由其它软件产生的数据,然后由load 命令读入到MATLAB 中,并绘制出曲线。例如,MATLAB 提供了一个多峰函数peaks.m:
f(x,y)=3(1-x)^2e^{-x^2-(y+1)^2}-10(x/5-x^3-y^5)e^{-x^2-y^2}-1/3e^{-(x+1)^2-y ^2}
我们可以方便地产生多条曲线的数据: [x,y]=meshgrid(-3:0.15:3); % or: [x,y]=meshgrid(-3:0.15:3,-3:0.15:3); z=peaks(x,y); % 得41(?)条曲线的数据
% 本人用help 查默认值为49
x=x(1,:);
figure(1)
plot(x,z), grid on
4
第二种方法: 在一个plot 函数中分别指定每条曲线的数据。例如,对于下列两个函数(神经网络中的两个重要函数:logsig 和tansig ): y_1=1/(1+e^{-x}), y_2=(1-e^{-x})/(1+e^{-x}) 可分别求出从-5到+5之间的值,然后在同一张图上画出曲线: x=[-5:.1:5];
y1=1./(1+exp(-x)); y2=(1-exp(-x)).*y1; figure(1)
subplot(1,1,1)
plot(x,y1,'r-',x,y2,'b--'), grid on legend('logsig 函数', 'tansig 函数') title('多条曲线')
第三种方法: 利用hold on. 先在图形窗口中绘制出第一条曲线,然后再利用hold on ,使之保持原有图形,最后绘制第二条、第三条…..等曲线。例如,对于上图的曲线,我们可以如下得到: figure(1)
plot(x,y1,'r-') hold on
plot(x,y2,'b--'),grid on
利用这种方法可在绘制函数曲线后,可同时在数据点上以记号标注。例如,对简单的正弦函数
x=0:pi/20:2*pi; y=sin(x); figure(1), subplot(1,1,1)
plot(x,y,'r-'), hold on
plot(x,y,'bo'), grid on title('sin(\alpha)')
xlabel('\alpha'),
ylabel('sin(\alpha)')
图中在每个数据点上用一圆圈表示,这种方式可用来表示数据的拟合的内插。
四、利用plotyy 函数可绘制出双y 轴的图形,
这样在同一张图上表示两条曲线时,可拥有各自的y 轴。例如:
t=-pi:pi/20:pi;
y1=sin(t); y2=2*cos(t); plotyy(t,y1,t,y2), grid on title( '双y 轴正余弦曲线' )
text(0, 0, '\leftarrow sin(t)' )
text(pi/2, 0, '\leftarrow 2cos(t)' )
由图可见,虽然y1和y2具有不同的值域,但由于采用了双y轴,因此两条曲线在显示上具有相同的“幅值”。
五.坐标轴控制——只要求第一个图的做法
利用box函数可控制图形的边框,box off可关闭图形边框,这时图形只有x-y轴,而没有上、下边框,这样绘制的图形与通常在坐标纸上所画的图形一致。
另外,利用axis可控制坐标轴的刻度,这样在两个图形对比时,可有相同的比例因子。
例如,对于一个复杂的函数:
y=cos(tan(pi*x)),
利用plot函数绘制曲线时,在x=0.5附近几
乎看不清。现在如果利用axis函数调整x轴
刻度,则可以比较清晰地看到这一局部区
域:
x=0:1/3000:1; y=cos(tan(pi*x));
figure(1)
subplot(2,1,1), plot(x,y)
title('复杂函数')
subplot(2,1,2), plot(x,y)
axis([0.45 0.55 -1 1]);
title('复杂函数的局部透视')
设已由其它系统测量出两种方法的误差,保存于err.dat中,其中第一行(也可以是列)为采样时刻,第二、三行分别为两种方法的测量值。现直接绘制出误并曲线,同时绘出利用axis控制刻度后的误差曲线:
err=[1 2 3 4 5;0.03 0.02 0.01 0.06 0.036;0.028 0.06 0.07 0.028 0.19];
t=err(1,:); e1=err(2,:); e2=err(3,:);
figure(1)
subplot(2,2,1), plot(t,e1), title('误差1')
subplot(2,2,2), plot(t,e2), title('误差2')
subplot(2,2,3), plot(t,e1), title('坐标轴调整后的误差')
axis([1 5 0 0.4])
subplot(2,2,4), plot(t,e2),title('坐标轴调整后的误差2')
axis([1 5 0 0.2])
5
6
由图可见,上下两图由于没有一致的轴刻度,因此,无法对这两种误差进行对比,而下两图采用了一致的轴刻度,就可以看出误差的优劣。
在[0,pi/2]之间绘制出y=tan(x)曲线:
x=0:.025:pi/2; y=tan(x); figure(1)
plot(x,y,'r-o'), grid on
box off , axis([0 pi/2 0 10])
title('正切函数'), xlabel('角度(弧度)')
经
axis 函数处理后,可清晰地反映tg(x)的慢变过程。axis equal (?) 可使输出图形的x,y 轴上单位长等长,因此在图形窗口绘制的圆或椭圆都可以用圆来表示
t=0:pi/20:2*pi; figure(1)
subplot(2,2,1), plot(sin(t),cos(t)) title('圆形轨迹')
subplot(2,2,2), plot(sin(t),2*cos(t)) title('椭圆形轨迹')
subplot(2,2,3), plot(sin(t),cos(t)),
axis square %square 使轴等长 title('调整后的圆形轨迹')
subplot(2,2,4), plot(sin(t),2*cos(t)), axis square
title('调整后的椭圆形轨迹')
利用axis off 命令可关闭坐标轴的显示,从而可产生不含坐标轴的图形: t=0:pi/20:2*pi;
[x,y]=meshgrid(t); z=sin(x).*cos(y); %?? figure(1)
subplot(1,1,1) %恢复到一个图区
plot(t,z), axis([0 2*pi -1 1]) box off, axis off
title('无坐标轴和边框的图形')
六、 颜色控制——不要求
在绘制曲线时可直接指定曲线的颜色,在标注文本如title, xlabel, ylabel, zlabel, text 命令中,可使用文本特性Color 来指定文本的颜色:
x=[-pi:pi/20:pi]; y=exp(-2*sin(x)); figure(1)
plot(x,y,'r-'), grid on
title('绿色的标题(y=e^{-2sin(x)})',...
'Color', 'g')
xlabel('兰色的x 轴标注', 'Color', 'b') ylabel('兰色的y 轴标注', 'Color', 'b') text(-0.6, 3.8, '\leftarrow 黑色的... 曲线标注','Color', 'k')
利用colormap 函数可改变每种颜色的色调。MATLAB 提供了许多种不同用途的颜色板。为了进一步了解各种颜色板的颜色,可输入:
cmap=colormap; L=length(cmap); x=[1:L]; y=x'*ones(size(x)); figure(1)
subplot(1,1,1)
bar(x(1:2), y(1:2, :)) title('gray 颜色板的颜色') colormap('gray')
MATLAB 专门提供了人体脊骨的图象,利用bone 颜色板可更清晰地显示这一图象:
load spine image(X)
colormap bone
title('人体脊骨图
')
load spine
image(X)
人体脊骨图
50
100
150
200
250
300
350
400
450
50
100
150200
250
300350
8
colormap bone
title('人体脊骨图')
七、高级绘图
除了前面介绍的二维空间为图形窗口的绘图功能外,MATLAB 还提供了一些很强的绘图功能,这些函数并没有在前几部分给出,因为它们已属于高线用户使用的命令,但不妨你也试着用一用。
这里要用到的函数有mashgrid, bar, barh, hist, pie, plot3, sphere, cylinder, surf, contour 等。 1.meshgrid
此函数可产生x,y 轴向的网格数据。一般格式为[X,Y]=meshgrid(x,y), 其中向量x,y 分别指定x 轴和y 轴向的数据点。当x 为n 维向量、y 为m 维向量时,X 、Y 均为m*n 的矩阵,X(i,j)和Y(i,j)共同指定了平面上的一点。如前面已经出现过的:
(问题: X 和Y 是如何生成的呢?)
当然,当x,y 轴取同一向量时,可简写成[X ,Y]=meshgrid(x);
t=0:pi/20:2*pi;
[x,y]=meshgrid(t); z=sin(x).*cos(y); figure(1)
subplot(1,1,1) plot(t,z), axis([0 2*pi -1 1]) box off, axis off
title('无坐标轴和边框的图形')
它还可以推广到三维情况: [X,Y,Z]=meshgrid(x, y, z). 2. bar, barh
bar 和barh 函数可在二维平面上绘制出条形图,它以条形块来表示数值的大小。bar 和barh 最常用的格式为bar(x,y,Linespec), 其中LineSpec 用于指定条形块的颜色。 barh 用于绘制水平的条形图
在bar(Y,'style')中,当Y 为矩阵时,则可按指定格式绘制条形:
style=group 时,分组绘制条形图,即Y 中每一行为一组,分别按不同颜色绘出条形图 style=stack 时,则将每组中的值分段以不同颜色绘制出条形图,即每一行中的值一个接一个绘制在同一个条形块中。
在bar(…,width)中,可利用width 指定的条形块的相对宽度,缺省时为0.8. 如:
x=-2.9:0.2:2.9; bar(x,exp(-x.*x),'r') % 2
x e y -=偶函 title('条形图\ity=\rme^{-\itx^2}')
9
例如 我们可以用随机函数rand 产生一个矩阵,从而得到复杂的条形图:
Y=round(rand(5,3)*10);
%生成5行3列的随机矩,round 为负数向下,正数向上的取整。 % See also floor, ceil, fix. figure(1)
subplot(2,2,1), bar(Y, 'group'),
title 'Group' %每行组成一组,共5组 subplot(2,2,2),
bar(Y, 'stack'), title 'Stack'
%每组中的值一个接一个地分段以不同颜色绘制 subplot(2,2,3),
barh(Y, 'stack'), title 'Stack' subplot(2,2,4),
bar(Y, 1.5), title 'Width=1.5'
1
2
34
5
2468
10Group
1
2
3
4
5
5101520
25Stack
10
20
30
1234
5Stack
1
2
3
4
5
5
10
Width=1.5
10
3. hist
hist 函数可在二维平面上绘制出柱状图,用来表示数据的分布情况。其常用格式为hist(y,x). 如
x=-2.9:0.1:2.9;
y=randn(20000,1);
figure(1), subplot(1,1,1) hist(y,x) title('柱状图表示数据分布')
4. pie
pie 函数可绘制出饼图,其常用格式为
pie(x,explode)可利用explode 指定分离出的切片。如:
x=[1.1 2.8 0.5 2.5 2]; figure(1)
subplot(1,2,1) pie(x)
title('未分离切片的饼图') subplot(1,2,2)
explode=[0 1 0 0 0]; colormap hsv pie(x, explode) title('饼图')
6%
未分离切片的饼图6%
饼图
5. plot3
plot3函数可绘制出三维图形,其常用格式为plot3(x,y,z,LineSec), 它非常类似于二
维绘图函数plot. 如:
t=0:pi/50:8*pi;
figure(1)
subplot(1,1,1)
plot3(sin(t),cos(t),t) %螺旋线
grid on , axis square %使轴等长
title('三维曲线')
又对多峰函数,我们可以在三维空间中画出三维曲线:[x,y]=meshgrid(-3:.125:3);
z=peaks(x,y);
figure(1)
plot3(x,y,z), grid on
title('多峰函数的三维曲线')
多峰函数的三维曲线
6. mesh, meshc
mesh函数可绘制出三维空间上的网格曲线,其常用格式为mesh(x,y,z), meshc函数可同时绘制出轮廓图(也即等高线图)。如:
[x,y]=meshgrid(-3:.125:3);
z=peaks(x,y); c=ones(size(z));
figure(1)
mesh(x,y,z,c), grid on
title('多峰函数的网格曲线')
7. surf, surfc
11
surf函数可绘制二维曲面,其常用格式为surf(x,y,z), surfc函数可同时绘制等高线图。如
[x,y]=meshgrid(-3:.125:3);
z=peaks(x,y); c=ones(size(z));
figure(1)
surfc(x,y,z,c), grid on
title('多峰函数的曲面')
8. sphere
sphere函数可在三维空间上画出一个球。如
figure(1)
sphere
axis equal %用square效果一样
title('球')
9. cylinder
cylinder函数可在三维空间上画出柱体,其常用格式为cylinder和cylinder(r),其中r用于指定轮廓曲线。如
figure(1)
cylinder, axis square
h=findobj('Type', 'surface');
set(h, 'Cdata', rand(size(get(h, 'Cdata'))))
title('柱体图')
利用cyinder(r)可产生具有一定外形的柱体。如
t=0:pi/10:2*pi;
figure(1)
[X,Y,Z]=cylinder(2+cos(t));
surf(X,Y,Z), axis square
title('柱体图')
12
13