1第四讲MATLAB的绘图功能1.二维图形绘制命令MATLAB不但擅长于矩阵相关的数值运算,也适合用在各种科学视图表示(Scientificvisualization)。下面将介绍MATLAB基本xy平面及xyz空间的各项绘图命令,包含一维曲线及二维曲面的绘制、列印及存档。plot是绘制一维曲线的基本函数,但在使用此函数之前,我们需先定义曲线上每一点的x及y坐标。下例可画出一条正弦曲线:closeall;x=linspace(0,2*pi,100);%100个点的x坐标y=sin(x);%对应的y坐标plot(x,y);小整理:MATLAB基本绘图函数plot:x轴和y轴均为线性刻度(Linearscale)loglog:x轴和y轴均为对数刻度(Logarithmicscale)semilogx:x轴为对数刻度,y轴为线性刻度semilogy:x轴为线性刻度,y轴为对数刻度若要画出多条曲线,只需将坐标对依次放入plot函数即可:plot(x,sin(x),x,cos(x));2若要改变颜色,在坐标对后面加上相关字符串即可:plot(x,sin(x),'c',x,cos(x),'g');若要同时改变颜色及图线型态(Linestyle),也是在坐标对后面加上相关字符串即可:plot(x,sin(x),'co',x,cos(x),'g*');小整理:plot绘图函数的叁数符号颜色符号颜色符号线型符号标记符号标记‘b’蓝色‘c’青色‘_’实线‘v’‘x’叉号‘g’绿色‘k’黑色‘__’虚线‘^’‘+’加号‘m’洋红色‘r’红色‘:’点线‘’‘pentagram’五角星☆‘w’白色‘y’黄色‘_.’点划线‘’‘diamond’◇‘none’无线‘o’圆圈‘hexagram’六角星‘*’星号‘square’□图形完成后,我们可用axis([xmin,xmax,ymin,ymax])函数来调整图轴的范围:axis([0,6,-1.2,1.2]);3此外,MATLAB也可对图形加上各种注解与处理:xlabel('InputValue');%x轴注解ylabel('FunctionValue');%y轴注解title('TwoTrigonometricFunctions');%图形标题legend('y=sin(x)','y=cos(x)');%图形注解gridon;%显示格线我们可用subplot来同时画出数个小图形于同一个视窗之中:subplot(2,2,1);plot(x,sin(x));subplot(2,2,2);plot(x,cos(x));subplot(2,2,3);plot(x,sinh(x));subplot(2,2,4);plot(x,cosh(x));MATLAB还有其他各种二维绘图函数,以适合不同的应用,详见下表。小整理:其他各种二维绘图函数bar长条图stairs阶梯图errorbar图形加上误差范围stem针状图fplot较精确的函数图形fill实心图polar极坐标图feather羽毛图hist累计图compass罗盘图4rose极坐标累计图quiver向量场图以下我们针对每个函数举例。当数据点数量不多时,长条图是很适合的表示方式:closeall;%关闭所有的图形视窗x=1:10;y=rand(size(x));bar(x,y);对于m*n维的矩阵,函数bar绘制得到m组条形图,每组有n个垂直条形图。如4*5维矩阵a,得条形图:a=[12321;23432;34543;45654];bar(a)legend('第一列','第二列','第三列','第四列','第五列',2)grid如果已知数据的误差量,就可用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.020.2]);%[0.020.2]是绘图范围5若要产生极坐标图形,可用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);6stairs可画出阶梯图: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);fill将数据点视为多边行顶点,并将此多边行涂上颜色:x=linspace(0,10,50);y=sin(x).*exp(-x/3);fill(x,y,'b');%'b'为蓝色7feather将每一个数据点视复数,并以箭号画出: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);2.三维网图的高级处理1).三维绘图函数plot3格式1:plot3(x,y,z)%若x、y、z为3个长度相等的向量,则在三维空间中产生一条曲线,第点的坐标相对于向量x、y、z的值。如:产生一个三维螺旋线t=0:pi/50:5*pi;x=cos(t);y=sin(t);plot3(t,x,y)格式2:plot3(x,y,z,cs)%x、y、z用法同格式1,cs为指定曲线的颜色与线型。如:plot3(t,x,y,'rP')2).消隐处理例:比较网图消隐前后的图形z=peaks(50);8subplot(2,1,1);mesh(z);title('消隐前的网图')hiddenoffsubplot(2,1,2)mesh(z);title('消隐后的网图')hiddenoncolormap([001])3).裁剪处理利用不定数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([001])%蓝色网线9注意裁剪时矩阵的对应关系,即大小一定要相同。4).三维旋转体的绘制为了一些专业用户可以更方便地绘制出三维旋转体,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=[11]例:柱面函数演示举例x=0:pi/20:pi*3;r=5+cos(x);[a,b,c]=cylinder(r,30);mesh(a,b,c)例:旋转柱面图.t=0:pi/12:3*pi;10r=abs(exp(-0.25*t).*cos(t));[X,Y,Z]=cylinder(r,30);mesh(X,Y,Z)colormap([100])(2).球面图球面图绘制由函数sphere来实现N=50;[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')3.练习1)绘制曲线y=x3+x+1,x的取值范围为[-5,5]。2)有一组测量数据满足y=e-at,t的变化范围为0~10,用不同的线型和标记画出a=0.1,a=0.2,a=0.5三种情况下的曲线;在结果图中添加标题“y=e-at”,并用箭头线标识出各曲线a的取值;在结果图中添加图例框。提示:(1)添加标题语句:title('\ity\rm=e^{-\itat}')11title('\ity\rm=e^{-\itat}','FontSize',12)(2)箭头线标识语句:text(t(6),y1(6),'\leftarrow\ita\rm=0.1','FontSize',11)(3)图例框语句:legend('a=0.1','a=0.2','a=0.5')3)用subplot语句在一个图形窗口上开多个大小不等的子窗口进行绘图并添加注释,见图。答案:(请注意观察编程过程)subplot('position',[0.1,0.15,0.3,0.65])hist(randn(1,1000),20);xlabel('直方图')subplot('position',[0.45,0.52,0.25,0.28])[xp,yp,zp]=peaks;contour(xp,yp,zp,15,'k')holdonpcolor(xp,yp,zp)shadinginterpholdoffaxisofftext(-1.2,-4,'伪彩色图')subplot('position',[0.72,0.5,0.25,0.3])sphere(25);axisequal,axis([-0.75,0.75,-0.75,0.75,-0.75,0.75])light('Position',[132]);12light('Position',[-3-13]);materialshinyaxisofftext(-0.8,-0.7,-1,'三维图')subplot('position',[0.45,0.15,0.5,0.25])t=0:pi/15:pi;y=sin(4*t).*sin(t)/2;plot(t,y,'-bs','LineWidth',2,...%设置线型'MarkerEdgeColor','k',...%设置标记点边缘颜色'MarkerFaceColor','y',...%设置标记点填充颜色'MarkerSize',5)axis([0,3.14,-0.5,0.5])xlabel('带标记点的线图')subplot('position',[0.1,0.9,0.8,0.1])text(0.25,0.2,'多窗口绘图示例',...'fontsize',25,'fontname','隶书','color','b')axisoff