文档库 最新最全的文档下载
当前位置:文档库 › Ch3.1-图形系统

Ch3.1-图形系统

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

相关文档
相关文档 最新文档