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]) 球面图绘制由函数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]是绘图范围 <![endif]> 若要产生极座标图形,可用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); <![endif]> 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等格式保存。然后,再打开相应的文档,并在该文档中选择【插入】菜单中的【图片】选项插入相应的图片即可。 |
|