MATLAB有很强的图形功能,可以方便地实现数据的视觉化。强大的计算功能与图形功能相结合为MATLAB在科学技术和教学方面的应用提供了更加广阔的天地。下面着重介绍二维图形的画法,对三维图形只作简单叙述。
6.1 二维图形的绘制
6.1.1 基本形式
二维图形的绘制是MATLAB语言图形处理的基础,MATLAB最常用的画二维图形的命令是plot,看两个简单的例子:
>> y=[0 0.58 0.70 0.95 0.83 0.25];
>> plot(y)
生成的图形是以序号 为横坐标、数组y的数值为纵坐标画出的折线。
>> x=linspace(0,2*pi,30); % 生成一组线性等距的数值
>> y=sin(x);
>> plot(x,y)
生成的图形是 上30个点连成的光滑的正弦曲线。
6.1.2 多重线
在同一个画面上可以画许多条曲线,只需多给出几个数组,例如
>> x=0:pi/15:2*pi;
>> y1=sin(x);
>> y2=cos(x);
>> plot(x,y1,x,y2)
则可以画出图5-3。多重线的另一种画法是利用hold命令。在已经画好的图形上,若设置hold on,MATLA将把新的plot命令产生的图形画在原来的图形上。而命令hold off 将结束这个过程。例如:
>> x=linspace(0,2*pi,30); y=sin(x); plot(x,y)
先画好图5-2,然后用下述命令增加cos(x)的图形,也可得到图5-3。
>> hold on
>> z=cos(x); plot(x,z)
>> hold off
6.1.3 线型和颜色
MATLAB对曲线的线型和颜色有许多选择,标注的方法是在每一对数组后加一个字符串参数,说明如下:
线型 线方式: - 实线 :点线 -. 虚点线 - - 波折线。
线型 点方式: . 圆点 +加号 * 星号 x x形 o 小圆
颜色: y黄; r红; g绿; b蓝; w白; k黑; m紫; c青.
以下面的例子说明用法:
>> x=0:pi/15:2*pi;
>> y1=sin(x); y2=cos(x);
>> plot(x,y1,’b:+’,x,y2,’g-.*’)
6.1.4 网格和标记
在一个图形上可以加网格、标题、x轴标记、y轴标记,用下列命令完成这些工作。
>> x=linspace(0,2*pi,30); y=sin(x); z=cos(x);
>> plot(x,y,x,z)
>> grid
>> xlabel(‘Independent Variable X’)
>> ylabel(‘Dependent Variables Y and Z’)
>> title(‘Sine and Cosine Curves’)
也可以在图形的任何位置加上一个字符串,如用:
>> text(2.5,0.7,’sinx’)
表示在坐标x=2.5, y=0.7处加上字符串sinx。更方便的是用鼠标来确定字符串的位置,方法是输入命令:
>> gtext(‘sinx’)
在图形窗口十字线的交点是字符串的位置,用鼠标点一下就可以将字符串放在那里。
6.1.5 坐标系的控制
在缺省情况下MATLAB自动选择图形的横、纵坐标的比例,如果你对这个比例不满意,可以用axis命令控制,常用的有:
axis([xmin xmax ymin ymax]) [ ]中分别给出x轴和y轴的最大值、最小值
axis equal 或 axis(‘equal’) x轴和y轴的单位长度相同
axis square 或 axis(‘square’) 图框呈方形
axis off 或 axis(‘off’) 清除坐标刻度
还有axis auto axis image axis xy axis ij axis normal axis on axis(axis)
用法可参考在线帮助系统。
6.1.6 多幅图形
可以在同一个画面上建立几个坐标系, 用subplot(m,n,p)命令;把一个画面分成m×n个图形区域, p代表当前的区域号,在每个区域中分别画一个图,如
>> x=linspace(0,2*pi,30); y=sin(x); z=cos(x);
>> u=2*sin(x).*cos(x); v=sin(x)./cos(x);
>> subplot(2,2,1),plot(x,y),axis([0 2*pi –1 1]),title(‘sin(x)’)
>> subplot(2,2,2),plot(x,z),axis([0 2*pi –1 1]),title(‘cos(x)’)
>> subplot(2,2,3),plot(x,u),axis([0 2*pi –1 1]),title(‘2sin(x)cos(x)’)
>> subplot(2,2,4),plot(x,v),axis([0 2*pi –20 20]),title(‘sin(x)/cos(x)’)
6.2 三维图形
限于篇幅这里只对几种常用的命令通过例子作简单介绍.
6.2.1 带网格的曲面
例 作曲面z=f(x,y)的图形
用以下程序实现:
>> x=-7.5:0.5;7.5;
>> y=x;
>> [X,Y]=meshgrid(x,y); (3维图形的X,Y数组)
>> R=sqrt(X.^2+Y.^2)+eps; (加eps是防止出现0/0)
>> Z=sin(R)./R;
>> mesh(X,Y,Z) (3维网格表面)
画出的图形如图5-7. mesh命令也可以改为surf, 只是图形效果有所不同,读者可以上机查看结果。
6.2.2 空间曲线
例 作螺旋线 x=sint, y=cost, z=t
用以下程序实现:
>> t=0:pi/50:10*pi;
>> plot3(sin(t),cos(t),t) (空间曲线作图函数, 用法类似于plot)
画出的图形如图5-8
6.2.3 等高线
用contour 或 contour3 画曲面的等高线,如对图5-7的曲面, 在上面的程序后接
contour(X,Y,Z,10) 即可得到10条等高线。
6.2.4 其它
较有用的是给三维图形指定观察点的命令view(azi,ele),azi 是方位角, ele 是仰角.缺省时 azi= ele= .
三维网图的高级处理
1. 消隐处理
例.比较网图消隐前后的图形
z=peaks(50);
subplot(2,1,1);
mesh(z);
title('消隐前的网图')
hidden off
subplot(2,1,2)
mesh(z);
title('消隐后的网图')
hidden on
colormap([0 0 1])
2. 裁剪处理
利用不定数NaN的特点,可以对网图进行裁剪处理
例.图形裁剪处理
P=peaks(30);
subplot(2,1,1);
mesh(P);
title('裁剪前的网图')
subplot(2,1,2);
P(20:23,9:15)=NaN*ones(4,7); %剪孔
meshz(P) %垂帘网线图
title('裁剪后的网图')
colormap([0 0 1]) %蓝色网线
注意裁剪时矩阵的对应关系,即大小一定要相同.
3. 三维旋转体的绘制
为了一些专业用户可以更方便地绘制出三维旋转体,MATLAB专门提供了2个函数:柱面函数cylinder和球面函数sphere
(1) 柱面图
柱面图绘制由函数cylinder实现.
[X,Y,Z]=cylinder(R,N) 此函数以母线向量R生成单位柱面.母线向量R是在单位高度里等分刻度上定义的半径向量.N为旋转圆周上的分格线的条数.可以用surf(X,Y,Z)来表示此柱面.
[X,Y,Z]=cylinder(R)或[X,Y,Z]=cylinder此形式为默认N=20且R=[1 1]
例.柱面函数演示举例
x=0:pi/20:pi*3;
r=5+cos(x);
[a,b,c]=cylinder(r,30);
mesh(a,b,c)
例.旋转柱面图.
r=abs(exp(-0.25*t).*sin(t));
t=0:pi/12:3*pi;
r=abs(exp(-0.25*t).*sin(t));
[X,Y,Z]=cylinder(r,30);
mesh(X,Y,Z)
colormap([1 0 0])
(2).球面图
球面图绘制由函数sphere来实现
[X,Y,Z]=sphere(N) 此函数生成3个(N+1)*(N+1)的矩阵,利用函数 surf(X,Y,Z) 可产生单位球面.
[X,Y,Z]=sphere 此形式使用了默认值N=20.
Sphere(N) 只是绘制了球面图而不返回任何值.
例.绘制地球表面的气温分布示意图.
[a,b,c]=sphere(40);
t=abs(c);
surf(a,b,c,t);
axis('equal') %此两句控制坐标轴的大小相同.
axis('square')
colormap('hot')
6.3
其他各种二维绘图函数
bar 长条图
errorbar 图形加上误差范围
fplot 较精确的函数图形
polar 极座标图
hist 累计图
rose 极座标累计图
stairs 阶梯图
stem 针状图
fill 实心图
feather 羽毛图
compass 罗盘图
quiver 向量场图
以下我们针对每个函数举例。
当资料点数量不多时,长条图是很适合的表示方式:
close all; % 关闭所有的图形视窗
x=1:10;
y=rand(size(x));
bar(x,y);
如果已知资料的误差量,就可用errorbar来表示。下例以单位标准差来做资的误差量:
x = linspace(0,2*pi,30);
y = sin(x);
e = std(y)*ones(size(x));
errorbar(x,y,e)
对於变化剧烈的函数,可用fplot来进行较精确的绘图,会对剧烈变化处进行较密集的取样,如下例:
fplot('sin(1/x)', [0.02 0.2]); % [0.02 0.2]是绘图范围
若要产生极座标图形,可用polar:
theta=linspace(0, 2*pi);
r=cos(4*theta);
polar(theta, r);
对於大量的资料,我们可用hist来显示资料的分 情况和统计特性。下面几个命令可用来验证randn产生的高斯乱数分 :
x=randn(5000, 1); % 产生5000个 m=0,s=1 的高斯乱数
hist(x,20); % 20代表长条的个数
rose和hist很接近,只不过是将资料大小视为角度,资料个数视为距离,并用极座标绘制
表示:
x=randn(1000, 1);
rose(x);
stairs可画出阶梯图:
x=linspace(0,10,50);
y=sin(x).*exp(-x/3);
stairs(x,y);
stems可产生针状图,常被用来绘制数位讯号:
x=linspace(0,10,50);
y=sin(x).*exp(-x/3);
stem(x,y);
stairs将资料点视为多边行顶点,并将此多边行涂上颜色:
x=linspace(0,10,50);
y=sin(x).*exp(-x/3);
fill(x,y,'b'); % 'b'为蓝色
feather将每一个资料点视复数,并以箭号画出:
theta=linspace(0, 2*pi, 20);
z = cos(theta)+i*sin(theta);
feather(z);
compass和feather很接近,只是每个箭号的起点都在圆点:
theta=linspace(0, 2*pi, 20);
z = cos(theta)+i*sin(theta);
compass(z);
6.4图形的输出
在数学建模中,往往需要将产生的图形输出到Word文档中。通常可采用下述方法:
首先,在MATLAB图形窗口中选择【File】菜单中的【Export】选项,将打开图形输出对话框,在该对话框中可以把图形以emf、bmp、jpg、pgm等格式保存。然后,再打开相应的文档,并在该文档中选择【插入】菜单中的【图片】选项插入相应的图片即可。